@Valid和@RequestBody在控制器方法中

时间:2014-09-08 12:52:12

标签: java spring hibernate validation spring-mvc

我有一个奇怪的问题,我无法解决或找到答案。

我已经定义了自己的验证器:

@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注释自动装配自定义验证器并处理异常?

0 个答案:

没有答案