JSR-303验证框架在Springmvc中的应用

前言:之前在一个springmvc的项目中为了实现验证传入的参数接触了JSR-303框架,这是个基于javabean的服务端验证框架,需要将注解标注在数据模型类的属性或者对应的GET方法上。

框架依赖包:
1.validation-api-1.0.0.GA.jar(JSR-303规范标准接口)
2.hibernate-validator-4.3.1.Final.jar(接口的实现)
3.slf4j-log4j12-1.7.2.jar(hibernate-validator所需)
4.org.slf4j.api_1.6.4.jar

配置文件如下:


    <mvc:annotation-driven validator="validator" />
    <!-- 以下 validator  ConversionService 在使用 mvc:annotation-driven 会 自动注册-->
    <bean id="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
        <!-- 如果不加默认到 使用classpath下的 ValidationMessages.properties -->
        <property name="validationMessageSource" ref="messageSource" />
    </bean>

    <!-- 国际化的消息资源文件(本系统中主要用于显示/错误消息定制) -->
    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <!-- 在web环境中一定要定位到classpath 否则默认到当前web应用下找  -->
                <value>classpath:messages</value>
                <value>classpath:org/hibernate/validator/ValidationMessages</value>
            </list>
        </property>
        <property name="useCodeAsDefaultMessage" value="false" />
        <property name="defaultEncoding" value="UTF-8" />
        <property name="cacheSeconds" value="60" />
    </bean>

配置好之后就可以使用了。由于JSR-303基于javabean,所以要先创建数据模型类,然后将注解标在相应的属性位置上。

public class Orders {
    @Min(value=1,message="{orders.NO.notnull}",groups={Delete.class,TransactionComplete.class,Update.class,Add.class,GetOrderDetail.class})
    public int NO;
    @Min(value=1,message="{store.ID.notnull}",groups={GetComplete.class,Add.class})
    public int StoreID;
    @NotNull(message="{orders.CreatedTime.notnull}",groups={Add.class})
    public String  CreatedTime;
    public String  AffirmTime;
    public String ArriveTime;
    @NotNull(message="{orders.DistributionTime.notnull}",groups={Update.class})
    public String DistributionTime;
    @NotNull(message="{user.CloudID.notnull}",groups={Get.class,Address.class})
    public String UserId;
    @Range(min=0,max=4,message="{orders.State.notnull}",groups={Add.class})
    public int State;
    @NotNull(message="{orders.PayWay.notnull}",groups={Add.class})
    public String PayWay;
    @NotNull(message="{orders.Money.notnull}",groups={Add.class})
    public String Money;
    @NotNull(message="{orders.PayMoney.notnull}",groups={Add.class})
    public String PayMoney;
    @NotNull(message="{address.Address.notnull}",groups={Add.class})
    public String Address;
    public int IntegralID;
    @NotNull(message="{orders.Satisfaction.notnull}",groups={Update.class})
    public String Satisfaction;
    public String CancelReason;
    public int DeliveryMode;
    public String PS;

    @Valid
    public OrderDetails orderDetails;
    }

正常使用时直接标注例如@NotNull,由于一个bean可能会用于不同的验证,所以后面的groups属性里面可以加上不同的标记(需要添加自定义接口)。同时需要验证多个bean的属性时,只需在关联的类里添加对象然后在对象上标注@Valid。

controller代码如下:

    @RequestMapping("/GetUserInf")
    @ResponseBody
    public Map<String, Object> getUserInf(@Validated({Get.class}) User user,BindingResult results){
        removeResult();
        if (results.hasErrors()) 
        {
            // 获取错误信息
            result = appService.responseMap(validateInf(results),Code.fail.getValue(),AppService.errorString);
        } else {
            result = appService.getUserInf(user.getCloudID());
        }
        return result;
    }

获取错误信息的方法:

private Map<String,Object> validateInf(BindingResult results)
    {

            List<FieldError> err = results.getFieldErrors();
            FieldError fe;
            String field;
            String errorMessage;
            for (int i = 0; i < err.size(); i++) 
            {
                fe = err.get(i);
                field = fe.getField();// 得到那个字段验证出错
                errorMessage = fe.getDefaultMessage();// 得到错误消息
                result.put(field, errorMessage);
            }   
        return result;
    }

最后就是在已经配置路径下添加之前指定的配置文件啦!
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值