我正在尝试构建一个小的POC来检查我们是否可以在我们的项目(REST端点)上使用Spring验证。目标是在某些组件的方法上使用@Valid
注释,使用JSR-303
注释为参数进行注释,并为自定义验证逻辑构建一些Validator
实例。在Spring组件方法上使用@Valid注解
考虑以下情形:
帐户(getter和setter中省略)
public class Account {
private int id;
@Min(0) private double amount;
@NonNull private String cardholder;
}
的AccountController
@RestController
@RequestMapping("/account")
public class AccountController {
@Autowired private AccountService service;
@RequestMapping(method= RequestMethod.POST)
public void post(@RequestBody Account account) {
service.save(account);
}
}
帐户服务
@Component
public class AccountService {
public void save(**@Valid** Account account) {
// Logic ommited
log.info("Account saved!");
}
}
AccountSaveValidator
public class AccountSaveValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) { return Account.class.isAssignableFrom(clazz); }
@Override
public void validate(Object target, Errors errors) {
Account account = (Account) target;
if (**if account does not exist**)
errors.rejectValue("id", "account.not-exists");
}
}
每当我POST
到/account
,所提到的验证不运行,也不管是显示Account saved!
消息。但是,如果我将@Valid
注释放在AccountController
的POST
处理程序上,则会执行验证。
我只能通过调用它像这样保存()方法仅执行自定义验证(AccountSaveValidator)手动:
ValidationUtils.invokeValidator(new AccountSaveValidator(), account, errors);
if (errors.hasErrors()) {
throw new ValidationException(errors);
}
缺少什么我在这里?我读过这些验证组件通常与Spring-MVC
一起使用,但它可以在没有它的情况下使用。
的gradle这个依赖我有如下:
compile "org.springframework:spring-core"
compile "org.springframework:spring-context"
compile "org.springframework:spring-web"
compile "org.springframework.boot:spring-boot"
compile "org.springframework.boot:spring-boot-starter-web"
compile "org.springframework.boot:spring-boot-autoconfigure"
compile "javax.validation:validation-api:1.1.0.Final"
compile "org.hibernate:hibernate-validator:5.2.4.Final"
谢谢你的提示一节所述http://docs.spring.io/autorepo/docs/spring/3.2.x/spring-framework-reference/html/validation.html,我已经更新了标题,以反映实际的意图。 – everton