我有一个奇怪的问题,我无法解决或找到答案。
我已经定义了自己的验证器:
@Component
public class SingleInstanceValidator implements ConstraintValidator<SingleInstanceRule, Plan> {
@Autowired(required = true)
private UserService userService;
...
}
如果没有@Valid注释,我无法使注入工作,而是需要像这样注入。
@Component
public class SingleInstanceValidator implements ConstraintValidator<SingleInstanceRule, Plan> {
@Autowired(required = true)
private UserService userService;
@Override
public void initialize(SingleInstanceRule singleInstanceRule) {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
...
}
这使得它注入了UserService。但是,使用这个解决方案我无法使@ExceptionHandler工作,并且在我们的测试中注入也会失败。
使用@Valid我可以使注入和@ExceptionHandler正常运行(捕获BindException.class)
但是......这是我没有得到的问题。我不能将@RequestBody与@Valid一起使用,@ Autowired当时没有用,而且@ExceptionHandler不会工作。
所以在我们这之前:
@RequestMapping(method = RequestMethod.POST, produces = "application/json; charset=UTF-8")
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public Plan create(@RequestBody final Plan entity) throws Exception {
...
}
现在我想要这个:
... (same annotations before)
public Plan create(@Valid @RequestBody final Plan entity) throws Exception {
...
}
但这会失败。我试过并认为这会起作用而且确实
... (same annotations before)
public Plan create(@Valid Plan entity) throws Exception {
...
}
但是我们需要有@RequestBody注释,否则计划实体会丢失一些关系。
有没有人知道我们如何使用@Valid和@RequestBody来实现,并且仍然能够使用@ExceptionHandler注释自动装配自定义验证器并处理异常?