gpt4 book ai didi

java - 在 3 层 Entity-Repository-Service 应用程序中应该在哪里进行验证?

转载 作者:搜寻专家 更新时间:2023-11-01 03:23:07 25 4
gpt4 key购买 nike

我正在努力定义验证过程在应用程序不同层中的哪个位置会更好? (我在这里不是在谈论用户输入验证,我实际上是在谈论对象一致性)。

一个简单的例子:

  • A Blog具有字段 List<Comment> 的实体, 和一个方法
    boolean addComment(Comment comment)
  • 我想检查 comment boolean addComment(Comment comment) 的参数是null ,这将返回 false

对我来说,这样的检查可以同时在 Service 中完成。和 Entity层以确保所有内容在任何层都是一致的。

但这似乎是多余的,并且有一些东西告诉我只有一层应该承担这种责任。

我会说堆栈中最高的一个,因此是 Service层应该做这个验证?但是,当我编写单元测试时,不在 Entity 中再次进行该检查感觉不对。层。

最佳答案

我的建议是将它们放在服务的“公共(public)”接口(interface)处。对于任何公共(public)方法,您都无法对输入的质量提供任何形式的保证。

这是推理:

  • 服务可以向内部代码客户端呈现功能
  • 以及通过 Controller 暴露给网络服务。
  • Dao 的应该永远不会被公开,所以它们应该永远不需要实体验证。但实际上,他们会暴露。如果你确定只有服务调用 dao 的(并且只有相关的服务调用适当的 dao 的)然后你意识到 dao 是错误的地方
  • 服务代表代码的逻辑瓶颈,可以轻松进行验证。

执行此逻辑的最简单方法是创建一个方面并将验证代码放入其中。

<aop:aspect ref="validator" order="3">
<aop:before method="doValidation" pointcut="execution(public * com.mycompany.myapp.services.*.*(..))"/>"/>
</aop:aspect>

因此,这个方面bean 示例涵盖了服务层中的所有公共(public)方法。

@Aspect
public class ServiceValidator{

private Validator validator;

public ServiceValidator() {
}

public ServiceValidator(Validator validator) {
this.validator = validator;
}

public void doValidation(JoinPoint jp){
for( Object arg : jp.getArgs() ){
if (arg != null) {
// uses hibernate validator
Set<ConstraintViolation<Object>> violations = validator.validate(arg);
if( violations.size() > 0 ){
// do something
}
}
}
}
}

关于java - 在 3 层 Entity-Repository-Service 应用程序中应该在哪里进行验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23740638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com