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
。
我可以想到解决这个问题的两种方法:
- 介绍REST API层的DTO对象
- 手动/程序验证;使用 spring
Validator
或其他东西,无关紧要 - 简单地说,声明
我不太喜欢这两个样板,因为它们需要很多样板,这是一个微不足道的情况。
您可以使用验证组和@Validated
注释。
这样:
实体
@NotEmpty(groups = Create.class)
方法
public User register(@Validated(Create.class) User u) {
return service.createAppUser(u);
}