同一类不同层的弹簧(引导)验证注释



spring boot spring mvc spring data (带有)MongoDB 作为数据库)和一个用于在多层上表示请求的类(休息,服务,持久性)。

是否可以在类的字段上指定验证约束,以便其中一些仅适用于某些层(或某些层会忽略)?

示例:

实体(getter and setter autogenated)

 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或其他东西,无关紧要 - 简单地说,声明

我不太喜欢这两个样板,因为它们需要很多样板,这是一个微不足道的情况。

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

这样:

实体

@NotEmpty(groups = Create.class)

方法

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

最新更新