默认情况下,如果 Bean Validation 在 classpath 上存在(例如 Hibernate Validator),LocalValidatorFactoryBean 会被注册为全局 Validator,用于@Valid 和 Validated on controller 方法参数。

    比如加上 Hibernate Validator 的依赖

    1. implementation 'org.hibernate.validator:hibernate-validator:6.0.0.Final'
    2. // 该依赖在 org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator 中有用到,所以需要添加
    3. implementation group: 'org.glassfish', name: 'javax.el', version: '3.0.0'

    关于缺少依赖包这种,怎么看?最简单的方法是看 中央仓库中对应的页面,在页面中找到 Provided Dependencies
    image.png
    然后就找到对应的包了(当然有些包的作者不会写这个,就没有办法了,只能看报错的地方,缺少是什么依赖,再去找)

    1. @PostMapping("/data")
    2. @ResponseBody
    3. public Pet data(@Valid @RequestBody Pet pet) {
    4. System.out.println(pet);
    5. return pet;
    6. }
    1. package cn.mrcode.study.springdocsread.web;
    2. import javax.validation.constraints.NotNull;
    3. /**
    4. * @author mrcode
    5. */
    6. public class Pet {
    7. @NotNull
    8. private String name;
    9. public String getName() {
    10. return name;
    11. }
    12. public void setName(String name) {
    13. this.name = name;
    14. }
    15. }

    在 Java 配置中,你可以自定义全局验证器实例,如下例所示:

    1. @Configuration
    2. @EnableWebMvc
    3. public class WebConfig implements WebMvcConfigurer {
    4. @Override
    5. public Validator getValidator() {
    6. // ...
    7. }
    8. }

    下面的例子显示了如何在 XML 中实现同样的配置:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:mvc="http://www.springframework.org/schema/mvc"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xsi:schemaLocation="
    6. http://www.springframework.org/schema/beans
    7. https://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/mvc
    9. https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    10. <mvc:annotation-driven validator="globalValidator"/>
    11. </beans>

    注意,你也可以在本地注册 Validator 实现,如下例所示:

    1. @Controller
    2. public class MyController {
    3. @InitBinder
    4. protected void initBinder(WebDataBinder binder) {
    5. binder.addValidators(new FooValidator());
    6. }
    7. }

    :::tips 如果你需要在某个地方注入一个 LocalValidatorFactoryBean,创建一个 Bean,并用 @Primary 标记,以避免与 MVC 配置中声明的 Bean 发生冲突。 :::