模型层的业务规则

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模型层的业务规则相关的知识,希望对你有一定的参考价值。

在我的班上,我需要验证并保存movimentation的状态。我不知道在哪里放这个验证。我想我最好把它放在模型层而不是我的bean中。

我这样做:

1 - 搬家

@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 - MovimientoacaoBean

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'不能为null

我应该如何以及在哪里制定业务规则?编辑记录时也适用同样的问题。根据“勇气”和“valorQuitado”,状态可能会发生变化。编辑模式的区别在于,form.xhtml上的status属性是可见的(只读 - outputText)

答案

这取决于。我通常把它放进豆里。但是使用异常来检查服务层也是有意义的。 (如果你计划不同的前端等)下行可能是,如果你有很多验证,并且你想给最终用户提供适当的信息,它可能会有点棘手。

因此:我建议对这两个地方进行检查。

  • 在bean中,为每个输入验证最终用户的适当信息。
  • 在服务中提升一般异常并在bean中捕获它。

基本规则:

  • 确保你没有在服务中使用bean的东西(比如faces context或bean本身等)。
  • 确保在数据库上升异常之前进行检查。 (运行)

检查一下:link

以上是关于模型层的业务规则的主要内容,如果未能解决你的问题,请参考以下文章

理解业务的思维框架:数据模型+规则+语义

数据层或域层的规则验证?

架构中MVC模型和业务逻辑层的区别

业务逻辑和规则——如何将它们与领域模型解耦

数据仓库之数据模型

Spring Boot 业务逻辑层