2017-12-18 195 views
1

在我的課程中,我需要驗證並保存movimentation的狀態。我不知道把這個驗證放在哪裏。我想我最好把它放在模型層上,而不是放在我的bean中。模型層上的業務規則

我這樣做:

1 - Movimentacao

@SuppressWarnings("serial") 
@Entity 
public class Movimentacao implements Serializable, Entidade { 

    ... 

    @Column(nullable=false) 
    @NotNull 
    @DecimalMin("0.01") 
    private BigDecimal valor; 

    @Column(nullable=false) 
    @NotNull 
    @DecimalMin("0.01") 
    private BigDecimal valorQuitado;  

    @Enumerated(EnumType.STRING) 
    @Column(nullable=false, length=1) 
    private MovimentacaoStatus status; 

    ... 

    public void setStatus(MovimentacaoStatus status) { 
     this.status = status; 
    } 

} 

2 - form.xhtml

<!-- show only on edit mode (status not null) --> 
<h:outputText id="status" value="#{movimentacaoBean.movimentacao.status.descricao}" rendered="#{movimentacaoBean.movimentacao.status ne null}" /> 

3 - MovimentacaoBean

public String salvar() throws Exception{ 

    movimentacaoService.salvar(movimentacao); 
    this.movimentacao = null; 
    this.todos = null; 

    context.addMessage(null, new FacesMessage("Movimentação salva com sucesso", "")); 
    context.getExternalContext().getFlash().setKeepMessages(true); 

    return "pretty:financeiro-lista"; 

} 

狀態不是由用戶定義的。我應該在哪裏進行驗證?在setStatus上?

如果我改變setStatus到(例如):

public void setStatus() { 
//example. The real Business rules are other. 
this.status = MovimentacaoStatus.P; 
} 

public void setStatus(MovimentacaoStatus status) { //status variable never used... 
//example. The real Business rules are other. 
this.status = MovimentacaoStatus.P; 
} 

我收到以下錯誤(因爲MovimentacaoBean沒有收到form.xhtml狀態):

原因:java.sql.SQLIntegrityConstraintViolationException:列 'status'不能爲空

如何以及在哪裏我應該放置狀態的業務規則?編輯記錄時,同樣的問題也適用。取決於「勇氣」和「valorQuitado」,狀態可能會改變。編輯模式的不同之處在於狀態屬性在form.xhtml(只讀 - outputText)上可見

+0

你應該把驗證在bean。在Movimentacao上執行保存之前。你也可以在該領域做出要求(使用枚​​舉selectOneMenu是最好的選擇)。 – Milkmaid

+0

@Milkmaid也許在MovimentacaoService上更好,對不對?因爲如果我需要在JSF的其他技術上使用相同的類,則不會有耦合。 –

回答

0

這取決於。我通常把它放進豆子裏。但是使用異常來檢查服務層也是有意義的。 (如果你計劃不同的前端等) 缺點可能是,如果你有很多驗證,你想給最終用戶適當的信息,它可能會更棘手一些。

因此:我會建議在兩個地方做檢查。

  • 在bean中驗證每個輸入並向最終用戶提供正確的信息。

  • 在服務中引發一般異常並在bean中捕獲它。

基本規則:

  • 確保你沒有在服務中使用的bean的東西(像面背景下,或豆類本身等)。

  • 確保在數據庫上升異常之前執行檢查。(運行)

檢查這個問題,以及:link