zoukankan      html  css  js  c++  java
  • 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和装双系统的方法
    linux中使用vim编译C++程序
    存储器管理之页面置换算法
    Python中open文件的各种打开模式
    RAL调用
    分布式系统事务一致性解决方案
    消息队列设计
    nmq消息队列解析
    分布式session的实现
    分布式系统常用思想和技术总结 (入门很清楚)
  • 原文地址:https://www.cnblogs.com/MattCheng/p/10696226.html
Copyright © 2011-2022 走看看