我正在嘗試構建一個小的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