Spring MVC 验证器。为多个请求映射封装多个验证器初始化

Spring MVC Validator. encapsulate multiple validator initialization for multiple request mappings

我有一些控制器有多个方法,每个方法都有不同的 @RequestBody 域对象,有自己的验证器

@RestController
public class MyController {
    @Autowired
    private Validator BeanOneValidator;

    @Autowired
    private Validator BeanTwoValidator;

    @Autowired
    private Validator BeanThreeValidator;

    @InitBinder("BeanOne")
    private void initBeanOneBinder(WebDataBinder binder) {
        binder.setValidator(beanOneValidator));
    }

    @InitBinder("BeanTwo")
    private void initBeanTwoBinder(WebDataBinder binder) {
        binder.setValidator(beanTwoValidator));
    }

    @InitBinder("BeanThree")
    private void initBeanThreeBinder(WebDataBinder binder) {
        binder.setValidator(beanThreeValidator));
    }

    @RequestMapping(...)
    public requestWithBeanOne(@RequestBody @Valid BeanOne){...}
    @RequestMapping(...)
    public requestWithBeanTwo(@RequestBody @Valid BeanTwo){...}
    @RequestMapping(...)
    public requestWithBeanThree(@RequestBody @Valid BeanThree){...}
}

有没有办法在不声明多个@InitBinder 注释方法的情况下为控制器注册多个绑定器,就像它们在这里一样?

这样做是行不通的:

    @InitBinder({"BeanOne","BeanTwo","BeanThree"})
    private void initBeanOneBinder(WebDataBinder binder) {
        binder.addValidators(beanOneValidator, beanTwoValidator, beanThreeValidator));
    }

如果有一种方法可以全局注册验证器,而无需向控制器添加显式 @InitBinder 方法,那也足够了。

您可以在您的应用程序中添加一个 ControllerAdvice 来全局注册您的验证器:

import org.springframework.validation.DataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;

@ControllerAdvice
public class ValidatorAdvice {

    @InitBinder
    public void initBinder(DataBinder dataBinder) {
       // dataBinder.addValidators();
    }
}