加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Spring MVC+FastJson+hibernate-validator整合的完整实例教程

发布时间:2020-05-23 22:40:42 所属栏目:Java 来源:互联网
导读:一:hibernate-validator基础1.简介:通过使用注解Annotations给类或者类的属性加上约束(constraint),在运行期检查属性值的合法性.

一:hibernate-validator 基础

1. 简介:

通过使用注解Annotations 给类或者类的属性加上约束(constraint),在运行期检查属性值的合法性.

2. 作用:

在API接口开发中参数校验是非常重要的事情,因为客户端很可能会少传参数,或者值不合法,甚至参数值是恶意的,所以对客户端传来的参数的合法性就必须要校验了,其中将参数值的校验规则通过注解的形式注解到属性上是一种比较优雅的方式。

3. 常用的约束注解

  • @Null 被注释的元素必须为 null
  • @NotNull 被注释的元素必须不为 null
  • @AssertTrue 被注释的元素必须为 true
  • @AssertFalse 被注释的元素必须为 false
  • @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
  • @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
  • @Size(max=,min=) 被注释的元素的大小必须在指定的范围内
  • @Digits (integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
  • @Past 被注释的元素必须是一个过去的日期
  • @Future 被注释的元素必须是一个将来的日期
  • @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
  • Hibernate Validator 附加的 constraint
  • @NotBlank(message =) 验证字符串非null,且长度必须大于0
  • @Email 被注释的元素必须是电子邮箱地址
  • @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
  • @NotEmpty 被注释的字符串的必须非空
  • @Range(min=,max=,message=) 被注释的元素必须在合适的范围内
  • @URL(protocol=,host=,port=,regexp=,flags=) 被注释的字符串必须是一个有效的url
  • @CreditCardNumber 被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性
  • @ScriptAssert(lang=,script=,alias=) 要有Java Scripting API 即JSR 223 (“Scripting for the JavaTM Platform”)的实现
  • @SafeHtml(whitelistType=,additionalTags=) classpath中要有jsoup包

4. 初识hibernate-validator

public class Address {
 @NotNull private String line1;
 private String line2;
 private String zip;
 private String state;
 @Length(max = 20)
 @NotNull
 private String country;
 @Range(min = -2,max = 50,message = "Floor out of range")
 public int floor;
 // getter&&setter
}

二:整合校验 hibernate-validator

该示例是在SpringMVC+FastJson整合(http://www.jb51.net/article/139094.htm)基础上进行集成的,可以先看一下这篇文章(有源码供下载),在该文章的基础上整合hibernate-validator

整合步骤:

1、在pom.xml中引入hibernate-validator依赖

<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-validator</artifactId>
 <version>5.4.1.Final</version>
</dependency>

2、在[xxx]-servlet.xml中配置验证器:HibernateValidator

<!-- <mvc:annotation-driven> 增加验证器属性validator="validator" -->
<mvc:annotation-driven validator="validator">
 <mvc:message-converters register-defaults="true">
 <!-- 配置Fastjson 替换原来的jackson支持 -->
 <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
 <property name="supportedMediaTypes">
  <list>
  <value>text/html;charset=UTF-8</value>
  <value>application/json</value>
  </list>
 </property>
 <property name="features">
  <list>
  <value>QuoteFieldNames</value> 
  <value>WriteMapNullValue</value> 
  </list>
 </property>
 </bean>
 </mvc:message-converters>
 </mvc:annotation-driven>

 <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
 <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> 
 <property name="validationMessageSource" ref="messageSource"/> 
 </bean>

 <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
 <property name="basenames"> 
 <list> 
 <value>classpath:conf/settings/validation</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>

3、在src/main/resources/conf/settings位置定义验证消息文件描述 validation.properties

validation.common.not.null=该字段不能为空
validation.common.not.range=长度非法
validation.common.format.error=格式错误

validation.param.age=年龄未满18周岁

rep.error.unknown=未知错误

4、新建实体类以供测试

UserEntity

package com.mengdee.manage.validator;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
public class UserEntity {
 @Null(groups={GroupA.class})
 @NotNull(groups={GroupB.class})
 @Min(value = 1,message="id值必须大于0",groups={GroupB.class})
 private Long id;

 @NotBlank(groups={GroupA.class,GroupB.class})
 @Pattern(regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$",message="由6-21字母和数字组成,不能是纯数字或纯英文",groups={GroupA.class,GroupB.class})
 private String password;

 @NotBlank(groups={GroupA.class,GroupB.class})
 @Pattern(regexp="^((13[0-9])|(15[^4,D])|(18[0,3-9]))d{8}$",message="手机号格式不正确")
 private String phone;


 @NotBlank(groups={GroupB.class})
 @Length(min=6,max=12,message="昵称长度为6到12位")
 private String nickname;

 @Min(value=18,message="{validation.param.age}")
 private int age;

 @NotBlank(groups={GroupA.class})
 @Email(message="{validation.common.format.error}")
 private String email;

 @NotBlank
 @Length(min=3,max=10,message="{validation.common.not.range}")
 private String username;


 public UserEntity() {

 }


 public Long getId() {
 return id;
 }

 public void setId(Long id) {
 this.id = id;
 }

 public String getNickname() {
 return nickname;
 }

 public void setNickname(String nickname) {
 this.nickname = nickname;
 }

 public int getAge() {
 return age;
 }

 public void setAge(int age) {
 this.age = age;
 }

 public String getEmail() {
 return email;
 }

 public void setEmail(String email) {
 this.email = email;
 }

 public String getPassword() {
 return password;
 }

 public void setPassword(String password) {
 this.password = password;
 }

 public String getUsername() {
 return username;
 }

 public void setUsername(String username) {
 this.username = username;
 }

 public String getPhone() {
 return phone;
 }

 public void setPhone(String phone) {
 this.phone = phone;
 }
}

UserModel

package com.mengdee.manage.validator;
import javax.validation.constraints.Min;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
public class UserModel {
 @Min(value = 1,message="id值必须大于0")
 private long id;

 @NotBlank
 @Length(min=6,message="{validation.param.age}")
 private int age;

 @NotBlank
 @Email(message="{validation.common.format.error}")
 private String email;

 @NotBlank
 @Pattern(regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,message="由6-21字母和数字组成,不能是纯数字或纯英文")
 private String password;

 @NotBlank
 @Length(min=3,message="{validation.common.not.range}")
 private String username;

 @NotBlank
 @Pattern(regexp="^((13[0-9])|(15[^4,message="手机号格式不正确")
 private String phone;


 public UserModel() {

 }


 public long getId() {
 return id;
 }

 public void setId(long id) {
 this.id = id;
 }

 public String getNickname() {
 return nickname;
 }

 public void setNickname(String nickname) {
 this.nickname = nickname;
 }

 public int getAge() {
 return age;
 }

 public void setAge(int age) {
 this.age = age;
 }

 public String getEmail() {
 return email;
 }

 public void setEmail(String email) {
 this.email = email;
 }

 public String getPassword() {
 return password;
 }

 public void setPassword(String password) {
 this.password = password;
 }

 public String getUsername() {
 return username;
 }

 public void setUsername(String username) {
 this.username = username;
 }

 public String getPhone() {
 return phone;
 }

 public void setPhone(String phone) {
 this.phone = phone;
 } 
}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读