前言:之前在一个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;
}
最后就是在已经配置路径下添加之前指定的配置文件啦!