jeeplus中使用的JSR303-Hibernate Validator数据校验

使用jeeplus中JSR303数据校验相关的问题:

1.BaseController中beanValidator()方法调用了BeanValidators.validateWithException(validator, object, groups)工具方法,

	/**
	 * 服务端参数有效性验证
	 * @param object 验证的实体对象
	 * @param groups 验证组
	 * @return 验证成功:返回true;严重失败:将错误信息添加到 message 中
	 */
	protected boolean beanValidator(Model model, Object object, Class<?>... groups) {
		try{
			BeanValidators.validateWithException(validator, object, groups);
		}catch(ConstraintViolationException ex){
			List<String> list = BeanValidators.extractPropertyAndMessageAsList(ex, ": ");
			list.add(0, "数据验证失败:");
			addMessage(model, list.toArray(new String[]{}));
			return false;
		}
		return true;
	}

其中BeanValidators中

	/**
	 * 调用JSR303的validate方法, 验证失败时抛出ConstraintViolationException.
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static void validateWithException(Validator validator, Object object, Class<?>... groups)
			throws ConstraintViolationException {
		Set constraintViolations = validator.validate(object, groups);
		if (!constraintViolations.isEmpty()) {
			throw new ConstraintViolationException(constraintViolations);
		}
	}

该处使用Validator验证器接口通过注解方式进行了数据验证,那么问题是验证的过程是怎么样,最重要的是当一个实体类对象有很多属性时,此时如果验证失败时,如何获取到具体验证失败的属性?

 


1.什么是JSR303?

JSR303是java为bean数据合法性校验所提供的一个标准规范,叫做Bean Validation.

Bean Validation是一个运行时的数据校验框架,在验证之后验证的错误信息会被马上返回。

2.实现方式:Hibernate Validator

3.JSR303定义了一套可以标注在成员变量、属性方法上的校验注解。

@Null        验证对象是否为空
@NotNull    验证对象是否不为空

@AssertTrue    验证Boolean对象是否为true
@AssertFalse    验证Boolean对象是否为false

@Min            验证 Number 和 String 对象是否大等于指定的值  
@Max            验证 Number 和 String 对象是否小等于指定的值  

@DecimalMax     被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin     被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度

@Digits(integer=,fraction=)     验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Size(min=, max=)               验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 

@Past        验证 Date 和 Calendar 对象是否在当前时间之前  
@Future        验证 Date 和 Calendar 对象是否在当前时间之后 

@Pattern       验证 String 对象是否符合正则表达式的规则

4.Hibernate Validator是JSR303的一个参考实现,除了支持所有标准的校验注解之外,它还拓展了如下注解:

@NotBlank    检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格

@URL        验证是否是合法的url

@Email        验证是否是合法的邮件地址

@CreditCardNumber    验证是否是合法的信用卡好吗

@Length(min=, max=)     验证字符串的长度必须在指定的范围内

@NotEmpty         检查约束元素是否为NULL或者是EMPTY.用于array、collection、map、string

@Range(min,max,message)    验证属性值必须在合适的范围内

5.接下来做一个JSR303的测试

5.1新建一个项目,导入springmvc所需的jar包,编写web.xml和springmvc-config.xml

web.xml

  <!-- 配置前端控制器 -->
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:springmvc-config.xml</param-value>
  	</init-param>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>springmvc</servlet-name>
  	<url-pattern>/</url-pattern>
  </servlet-mapping>

springmvc-config.xml

	<!-- spring可以自动去扫描base-package下面的包或者子包下面的java类 如果扫描到有spring相关注解的类,则吧这个类注册为spring的bean -->
	<context:component-scan base-package="com.dj.controller" />
	<!-- 默认装配 -->
	<mvc:annotation-driven></mvc:annotation-driven>
	<!-- 视图解析器 -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 前缀 -->
		<property name="prefix">
			<value>/</value>
		</property>
		<!-- 后缀 -->
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>

5.2因为使用的是hibernate validator的实现,所以要导入所需的jar包,版本是5.4.1如图所示。

5.3编写一个用户注册的实体类

	@NotBlank(message="登录名不能为空")
	private String username;
	@NotBlank(message="密码不能为空")
	@Length(min=6,max=18,message="密码长度必须在6~18位之间")
	private String password;
	@Email(message="邮箱格式不正确")
	private String email;
	@Pattern(regexp="[1][3|4|5|7|8][0-9]{9}",message="手机号码格式不正确")
	private String phone//省略get、set方法

5.4编写一个controller

@RequestMapping(value="/{pagename}")
	public String page(@PathVariable String pagename,Model model){
		User user = new User();
		model.addAttribute("user",user);
		return pagename;
	}
	//数据校验使用@valid,后面跟着errors对象保存校验信息
	@RequestMapping(value="/test")
	public String regist(@Valid @ModelAttribute User user,Errors errors,Model model){
		if(errors.hasErrors()){
			return "regist";
		}
		model.addAttribute("user",user);
		return "success";
		
	}

5.5编写注册页面

	<form:form modelAttribute="user" action="test" method="post">
		用户名:<form:input path="username"/><span><form:errors path="username" cssStyle="color:red"/></span><br>
		密码:<form:input path="password"/><span><form:errors path="password" cssStyle="color:red"/></span><br>
		邮箱:<form:input path="email"/><span><form:errors path="email" cssStyle="color:red"/></span><br>
		手机号:<form:input path="phone"/><span><form:errors path="phone" cssStyle="color:red"/></span><br>
		<input type="submit" value="注册">
	</form:form>

5.6编写注册成功页面显示注册信息

用户名:${user.username }<br>
密码:${user.password }<br>
邮箱:${user.email }<br>
手机号:${user.phone }<br>

5.7测试结果

引用原文:JSR303的数据校验-Hibernate Validator方式实现

源码下载地址 https://files.cnblogs.com/files/dj-blog/JSR03Test.zip

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值