Hibernate validator使用和自定义validator及整合Spring MVC

Hibernate validator使用

导入validation-api-xxx.jar 以及  hibernate-validator-xxx.Final.jar

需要检查的java bean

Entity.java

import javax.validation.constraints.Max;
import org.hibernate.validator.constraints.Length;
public class Entity {
	@Max(value=3)//最大值为3
	private int age;
	@Length(max=1) //字符串长度最大为1,hibernate 扩展的
	private String name;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

值校验的测试类

import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
public class Tv {
	public static void main(String[] args) {
		ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
		Validator validator = factory.getValidator();

		Entity entity = new Entity();
		entity.setAge(12);
		entity.setName("admin");
		Set<ConstraintViolation<Entity>> constraintViolations = validator.validate(entity);
		for (ConstraintViolation<Entity> constraintViolation : constraintViolations) {
			System.out.println("对象属性:"+constraintViolation.getPropertyPath());
			System.out.println("国际化key:"+constraintViolation.getMessageTemplate());
			System.out.println("错误信息:"+constraintViolation.getMessage());
		}

	}
}

输出结果

这里有一个国际化的key值,国际化文件在org.hibernate.validator下面的一系列的properites文件里面,如果需要自定义那么可以拷贝出来放在src目录下

这里我们拷贝一个出来,新增一个key为maxlength=字符串长度最大不能超过{max} ,可以使用动态参数,这里的max值就是注解里面设定的值

然后修改Entity.java,name属性的message="{maxlength}"

@Length(max=1,message="{maxlength}") //{maxlength}对应配置文件中的key. 必须有{}
	private String name;

再次运行结果如下

自定义validator

首先自定义一个注解CannotContainSpaces (不能包含空格)

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;

@Constraint(validatedBy = CannotContainSpacesValidator.class) //具体的实现
@Target( { java.lang.annotation.ElementType.METHOD,
	java.lang.annotation.ElementType.FIELD })
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Documented
public @interface CannotContainSpaces {
	String message() default "{Cannot.contain.Spaces}"; //提示信息,可以写死,可以填写国际化的key

	int length() default 5;

	//下面这两个属性必须添加
	Class<?>[] groups() default {};
	Class<? extends Payload>[] payload() default {};

}

具体实现类CannotContainSpacesValidator.java

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class CannotContainSpacesValidator implements ConstraintValidator<CannotContainSpaces, String> {
	private int len;
	/**
	 * 初始参数,获取注解中length的值
	 */
	@Override
	public void initialize(CannotContainSpaces arg0) {
		this.len = arg0.length();
	}

	@Override
	public boolean isValid(String str, ConstraintValidatorContext constraintValidatorContext) {
		if(str != null){
			if(str.indexOf(" ") < 0){
				return true;
			}
		}else{
			constraintValidatorContext.disableDefaultConstraintViolation();//禁用默认的message的值
			//重新添加错误提示语句
			constraintValidatorContext
            .buildConstraintViolationWithTemplate("字符串不能为空").addConstraintViolation();
		}
		return false;
	}

}

使用的时候直接注解到对象的属性上面就可以了

@CannotContainSpaces
	private String name;

测试当name包含空格的时候 entity.setName("xx xx");

当name为null的时候

整合Spring MVC

首先新增配置文件内容(实体类里面的注解与上面完全相同)

	<!-- 国际化配置 -->
	<bean id="localeResolver"
		class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
	<bean id="messageSource"
		class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
		<property name="basenames">
			<list>
				<value>classpath:messages/messages</value>
				<value>classpath:messages/Validation</value>
			</list>
		</property>
		<property name="useCodeAsDefaultMessage" value="true" />
	</bean>
	<!-- 注册验证器 -->
	<mvc:annotation-driven validator="validator" />  

	<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
       <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
       <!-- 这里配置将使用上面国际化配置的messageSource -->
       <property name="validationMessageSource" ref="messageSource"/>
   </bean>

在Spring MVC 控制器中方法属性如下

/**
		 * 这里的@Valid必须书写, bindingResult参数也必须书写在后面,否则验证不通过就会返回400
		 * @param entity
		 * @param result
		 * @return
		 */
		@RequestMapping(value="/valid")
		public String validator(@Valid Entity entity,BindingResult result){
			if(result.hasErrors()){
				//如果严重没有通过,跳转提示
				return "error";
			}else{
				//继续业务逻辑
			}
			return "success";
		}

error.jsp中如下

导入spring标签库

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!-- commandName 控制器参数中对象名称 -->
<form:form commandName="entity">
	<!-- 显示全部错误信息用* -->
	<form:errors path="*"/>
</form:form>
<hr/>
<!-- 对象名称.属性名称    如果该对象的指定属性没有通过校验那么显示错误信息(根据当前语言显示不同国家的文字) -->
<form:errors path="entity.name"/>

校验注解说明

Bean Validation 中内置的 constraint
@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=)  被注释的元素必须在合适的范围内

注意

①:在整合Spring MVC的时候,ValidationMessages_zh_CN.properties文件如果不是放在src目录下(如上面放在src/messages/下面) 那么在属性文件里面不能使用动态参数获取了(如${length} ${max}这些). 必须将hibernate validation的国际化属性全部放到src目录下面才可以(不晓得为什么,如果你能解决顺便留个言)

②:我这里使用的是spring 4.1 + hibernate validation 5.1 ,如果你使用的是spring 3.2 需要对于的hibernate validation版本是 4.x的 不然在配置

org.springframework.validation.beanvalidation.LocalValidatorFactoryBean

这个的是会报错,

时间: 2024-07-28 13:53:20

Hibernate validator使用和自定义validator及整合Spring MVC的相关文章

Spring Boot整合Spring MVC、Spring、Spring Data JPA(Hibernate)

一句话总结:Spring Boot不是新的功能框架,而是为了简化如SSH.SSM等等多个框架的搭建.整合及配置.使用Spring Boot 10分钟搭建起Spring MVC.Spring.Spring Data JPA(Hibernate)基础后台架构.基本零配置,全注解. 步骤一: 使用Spring Boot提供的网站生成maven项目及基础依赖.打开https://start.spring.io/网站,右侧输入想要的特性依赖.输入Web提供整合Spring MVC,输入JPA提供整合Spr

openfire如何整合spring mvc

Openfire的web服务器使用的是jetty,jetty启动的类是AdminConsolePlugin,至于该类是何时调用的就不再赘述. Openfire整合spring MVC的关键点在于你是在何时初始化DispatcherServlet.如果你要把spring mvc整合在openfire项目中那么直接配在openfire的web.xml就行了,但是如果你是想把它配置在一个插件中,那么下面的配置过程可能就会对你有那么一点帮助.所需要用的jar包在网上去下载. 1)创建openfire插件

patchca整合Spring MVC生成超炫的验证码

官方的色调单一,随机色也不随机,黑不拉几的,很难看. 为此做了扩展实现,并整合了spring mvc,生成的验证码漂亮多了. 官网: http://code.google.com/p/patchca/ 官方效果: 下面是我整合到spring并修扩展后的效果: package com.lavasoft.ntv.web; import org.patchca.color.ColorFactory; import org.patchca.filter.predefined.*; import org.

MyBatis整合Spring MVC(易百教程)

MyBatis是ibatis的升级版,作为hibernate的老对手,它是一个可以自定义SQL.存储过程和高级映射的持久层框架.与Hibernate 的主要区别就是 Mybatis 是半自动化的,而 Hibernate 是全自动的,所以当应用需求越来越复杂的时候,自动化的 SQL 显得比较笨拙.经常搭框架的人应该都清楚,框架搭建的核心就是配置文件. 在这里我们需要创建 web 工程.今天将直接用 mybatis与Spring mvc 的方式集成起来,源码在本文结尾处下载.主要有以下几个方面的配置

spring 整合 spring mvc

需要进行 Spring 整合 SpringMVC 吗 ? 还是否需要再加入 Spring 的 IOC 容器 ? 是否需要再 web.xml 文件中配置启动 Spring IOC 容器的 ContextLoaderListener ? 1. 需要: 通常情况下, 类似于数据源, 事务, 整合其他框架都是放在 Spring 的配置文件中(而不是放在 SpringMVC 的配置文件中). 实际上放入 Spring 配置文件对应的 IOC 容器中的还有 Service 和 Dao. 2. 不需要: 都放

Spring Boot 实践折腾记(五):自定义配置,扩展Spring MVC配置并使用fastjson

每日金句 专注和简单一直是我的秘诀之一.简单可能比复杂更难做到:你必须努力理清思路,从而使其变得简单.但最终这是值得的,因为一旦你做到了,便可以创造奇迹.--源自乔布斯 题记 前两天有点忙,没有连续更新,今天接着聊.金句里老乔的话说得多好,但能真正做到的人又有多少?至少就我个人而言,我还远远没有做到这样,只是一个在朝着这个方向努力的人,力求简明易懂,用大白话让人快速的明白理解,简单的例子上手,让使用的人更多的去实战使用扩展,折腾记即是对自己学习使用很好的一次总结,对看的人也是一个参考的方法,希望

Apache cxf 整合 Spring MVC

1.添加依赖pom.xml <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.o

Spring MVC+Mybatis+Maven+Velocity+Mysql整合实例

本篇文章将通过一个简单显示用户信息的实例整合Spring mvc+mybatis+Maven+velocity+mysql. 对于实现整合的重点在于以下几个配置文件的实现 1.Maven依赖包 2.spring配置文件(springContext-user.xml) 3.mybatis配置文件(MyBatis-User-Configuration.xml) 4.spring-mvc配置文件(spring-mvc.xml) 5.web.xml配置文件 源码下载地址:http://download.

Freemark与Spring MVC的整合

1.项目的视图存放位置 2.整合Spring MVC 的配置,web.xml的配置如下 <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&