同一类

时间:2017-12-14 07:32:34

标签: java spring spring-mvc spring-boot spring-data

给定一个带有 Spring Boot 的Web应用程序, Spring MVC Spring Data (将 MongoDB 作为数据库)和一个用于在多个层上表示请求的类(REST,服务,持久性)。

是否可以在类的字段上声明性地指定验证约束,使得其中一些仅适用于某些层(或者某些层会被忽略)?

示例:

实体(自动生成getter和setter)

 public class User {

     private String name;

     @NotEmpty
     private String role;
 }

其中@NotEmpty JSR 303 anotation

REST API图层

这里不存在

role

@RestController
public class RegisterController {

    @Autowired
    private UserService service;

    @PostMapping
    public User register(@Valid User u) {
        return service.createAppUser(u);
    }
}

服务层

role由实现设置,并且是持久层

所必需的
@Service
public class UserService {

    @Autowired
    private UserRepo repo;

    private User createAppUser(User u) {
        u.setRole("APP_USER");
        return repo.save(u);
    }
}

其中repo Spring Data MongoRepository

我可以想到两种方法来解决这个问题:

  1. 介绍REST API层的DTO对象
  2. 手动/程序验证;使用 Spring Validator或其他东西,无关紧要 - 只是没有声明
  3. 我不喜欢这两个,因为他们需要很多样板,这是一个微不足道的案例。

1 个答案:

答案 0 :(得分:2)

您可以使用验证组和@Validated注释。

像这样:

<强>实体

@NotEmpty(groups = Create.class)

方式

public User register(@Validated(Create.class) User u) {
    return service.createAppUser(u);
}