在我的课堂上,我需要验证并保存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:Column 'status'不能为null
我应该如何以及在哪里制定业务规则以获取状态?编辑记录时也适用同样的问题。根据“勇气”和“valorQuitado”,状态可能会发生变化。编辑模式的不同之处在于status属性在form.xhtml(只读 - outputText)
上可见答案 0 :(得分:0)
这取决于。我通常把它放进豆里。但是使用异常来检查服务层也是有意义的。 (如果你计划不同的前端等) 下行可能是因为如果你有很多验证,并且你想向最终用户提供适当的信息,那可能会有点棘手。
因此:我建议对这两个地方进行检查。
在bean中为每个输入验证最终用户的正确信息。
在服务中提升一般异常并在bean中捕获它。
基本规则:
确保您不在服务中使用bean内容(如faces上下文或bean本身等)。
确保在数据库上升异常之前进行检查。 (运行时)
同时检查:link