给定一个带有 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
。
我可以想到两种方法来解决这个问题:
Validator
或其他东西,无关紧要 - 只是没有声明我不喜欢这两个,因为他们需要很多样板,这是一个微不足道的案例。
答案 0 :(得分:2)
您可以使用验证组和@Validated
注释。
<强>实体强>
@NotEmpty(groups = Create.class)
方式强>
public User register(@Validated(Create.class) User u) {
return service.createAppUser(u);
}