• Spring MVC 使用介绍(十五)数据验证 (二)依赖注入与方法级别验证


    一、概述

    JSR-349 (Bean Validation 1.1)对数据验证进一步进行的规范,主要内容如下:

    1、依赖注入验证

    2、方法级别验证

    二、依赖注入验证

    spring提供BeanValidationPostProcessor用于支持依赖注入验证,使用如下:

    配置

    <bean class="org.springframework.validation.beanvalidation.BeanValidationPostProcessor">
        <property name="validator" ref="validator"/>
    </bean>  
    # format.properties
    msg.size=测试{min}+++

      补充:validator配置同 Spring MVC 使用介绍(十三)数据验证 (一)基本介绍

    实体

    public class Person {
        @Size(min = 5, message = "{msg.size}")
        private String name;
        ...
    }

    bean注入

    <bean id="person" class="cn.matt.entity.Person">
        <property name="name" value="asdf" />
    </bean>

    启动spring,此时启动失败,报错如下:

    Bean state is invalid: name - 测试5+++

    三、方法级别验证

    方法级别验证可对方法的传参和返回值进行验证,spring提供MethodValidationPostProcessor用于支持该功能,使用如下:

    配置

    <bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">
        <property name="validator" ref="validator"/>
    </bean>

    业务类

    @Service
    @Validated // 开启方法级别验证,使用@Valid无效,可设置方法默认分组
    public class PersonService {
        public @Min(1) int getAge(@Size(min = 5, message = "{msg.size}") String name) {
            return 2;
        }
    }

      注:对于参数为对象的类型进行递归验证,须使用@Valid,使用@Validated无效

    测试

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath:spring-context.xml")
    public class ValidTest {
        
        @Autowired
        private PersonService testService;
    
        @Test(expected = ConstraintViolationException.class)
        public void test1() {
            testService.getAge("assd");
        }
    }

    四、在spring mvc中使用

    由于父上下文中的BeanPostProcessor无法作用于子上下文,子上下文中的BeanPostProcessor也无法作用于父上下文,因此如需同时对service层与controller层的方法或注入进行校验,须分别配置BeanValidationPostProcessor、MethodValidationPostProcessor

    参考:

    Spring3.1 对Bean Validation规范的新支持(方法级别验证)

  • 相关阅读:
    论 设计模式及项目架构的作用
    Linux根据进程号查找其程序文件路径 及 lsof 命令使用
    Synchronized 原理
    Seata 中类SPI使用机制分析
    redisson spring boot starter 做分布式锁
    TTFB 时间过长
    ShardingSphere Hint模式 SpringBoot + Mybatis
    Core源码(十三)Stack和ConcurrentStack
    C#源码(十二) HashSet
    Core源码(十一)Queue
  • 原文地址:https://www.cnblogs.com/MattCheng/p/10696226.html
Copyright © 2020-2023  润新知