`
hbxflihua
  • 浏览: 679115 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hibernate-validator简单应用

阅读更多

 

1、在项目中引入所需的jar

<!-- validator -->
<dependency>
	<groupId>javax.validation</groupId>
	<artifactId>validation-api</artifactId>
	<version>1.1.0.Final</version>
</dependency>
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>5.1.1.Final</version>
</dependency>

 

2、添加BeanValidators工具类(可选,方便在方法内校验POJO)

package com.huatech.common.validator;

import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.huatech.common.support.SpringContextHolder;


/**
 * JSR303 Validator(Hibernate Validator)工具类.
 * 
 * ConstraintViolation中包含propertyPath, message 和invalidValue等信息.
 * 提供了各种convert方法,适合不同的i18n需求:
 * 1. List<String>, String内容为message
 * 2. List<String>, String内容为propertyPath + separator + message
 * 3. Map<propertyPath, message>
 * 
 * @author lh
 * @version 2017-06-06
 */
public class BeanValidators {
     /**
      * JSR303校验器
      */
	private static final Validator VALIDATOR = SpringContextHolder.getBean("validator");

	public static <T> void validate(final T t) {
		Set<ConstraintViolation<T>> constraintViolations = VALIDATOR.validate(t);
		if (constraintViolations.size() > 0) {
			throw new RuntimeException(constraintViolations.iterator().next().getMessage());
//			final StringBuffer buffer = new StringBuffer();
//			for (final ConstraintViolation<T> violation : constraintViolations) {
//				buffer.append(violation.getMessage()).append(";");
//			}
//			throw new BusinessException(buffer.toString());
		}
	}
	

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

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>中为List<message>.
	 */
	public static List<String> extractMessage(ConstraintViolationException e) {
		return extractMessage(e.getConstraintViolations());
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolation>为List<message>
	 */
	@SuppressWarnings("rawtypes")
	public static List<String> extractMessage(Set<? extends ConstraintViolation> constraintViolations) {
		final List<String> errorMessages = Lists.newArrayList();
		for (ConstraintViolation violation : constraintViolations) {
			errorMessages.add(violation.getMessage());
		}
		return errorMessages;
	}

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为Map<property, message>.
	 */
	public static Map<String, String> extractPropertyAndMessage(ConstraintViolationException e) {
		return extractPropertyAndMessage(e.getConstraintViolations());
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolation>为Map<property, message>.
	 */
	@SuppressWarnings("rawtypes")
	public static Map<String, String> extractPropertyAndMessage(Set<? extends ConstraintViolation> constraintViolations) {
		Map<String, String> errorMessages = Maps.newHashMap();
		for (ConstraintViolation violation : constraintViolations) {
			errorMessages.put(violation.getPropertyPath().toString(), violation.getMessage());
		}
		return errorMessages;
	}

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为List<propertyPath message>.
	 */
	public static List<String> extractPropertyAndMessageAsList(ConstraintViolationException e) {
		return extractPropertyAndMessageAsList(e.getConstraintViolations(), " ");
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolations>为List<propertyPath message>.
	 */
	@SuppressWarnings("rawtypes")
	public static List<String> extractPropertyAndMessageAsList(Set<? extends ConstraintViolation> constraintViolations) {
		return extractPropertyAndMessageAsList(constraintViolations, " ");
	}

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为List<propertyPath +separator+ message>.
	 */
	public static List<String> extractPropertyAndMessageAsList(ConstraintViolationException e, String separator) {
		return extractPropertyAndMessageAsList(e.getConstraintViolations(), separator);
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolation>为List<propertyPath +separator+ message>.
	 */
	@SuppressWarnings("rawtypes")
	public static List<String> extractPropertyAndMessageAsList(Set<? extends ConstraintViolation> constraintViolations,
			String separator) {
		final List<String> errorMessages = Lists.newArrayList();
		for (ConstraintViolation violation : constraintViolations) {
			errorMessages.add(violation.getPropertyPath() + separator + violation.getMessage());
		}
		return errorMessages;
	}
}

  

package com.huatech.common.support;

import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext.
 * 
 * @author lh
 * @date 2017-06-06
 */
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {

	private static ApplicationContext applicationContext = null;

	private static final Logger LOGGER = LoggerFactory.getLogger(SpringContextHolder.class);

	/**
	 * 取得存储在静态变量中的ApplicationContext.
	 */
	public static ApplicationContext getApplicationContext() {
		assertContextInjected();
		return applicationContext;
	}

	/**
	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(String name) {
		assertContextInjected();
		return (T) applicationContext.getBean(name);
	}

	/**
	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
	 */
	public static <T> T getBean(Class<T> requiredType) {
		assertContextInjected();
		return applicationContext.getBean(requiredType);
	}

	/**
	 * 清除SpringContextHolder中的ApplicationContext为Null.
	 */
	public static void clearHolder() {
		LOGGER.debug("清除SpringContextHolder中的ApplicationContext:{}" , applicationContext);
		applicationContext = null;
	}

	/**
	 * 实现ApplicationContextAware接口, 注入Context到静态变量中.
	 */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) {
		LOGGER.debug("注入ApplicationContext到SpringContextHolder:{}", applicationContext);
		if (SpringContextHolder.applicationContext != null) {
			LOGGER.info("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:{}" , SpringContextHolder.applicationContext);
		}
		SpringContextHolder.applicationContext = applicationContext;
	}

	/**
	 * 实现DisposableBean接口, 在Context关闭时清理静态变量.
	 */
	@Override
	public void destroy() throws Exception {
		SpringContextHolder.clearHolder();
	}

	/**
	 * 检查ApplicationContext不为空.
	 */
	private static void assertContextInjected() {
		Validate.validState(applicationContext != null, "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
	}
}

 

3、在spring配置文件中添加资源配置

<mvc:annotation-driven validator="validator"/>

<!-- SpringContextHolder:可选 -->
<bean class="com.huatech.common.support.SpringContextHolder"/>
<!-- 国际化配置 -->  
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />  
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
	<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
	<!-- 这里配置将使用上面国际化配置的messageSource -->
	<property name="validationMessageSource" ref="messageSource" />
</bean>
<!-- 资源配置 -->
<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>  

     配置完成后在resources目录下创建messages文件夹 并在该文件夹下新建Validation_zh_CN.properties文件,为第4步做准备。

 

4、为Model类的相关属性添加校验注解

package com.huatech.model;

import java.lang.reflect.InvocationTargetException;
import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;
import org.hibernate.validator.constraints.NotEmpty;

import com.alibaba.fastjson.annotation.JSONField;
import com.huatech.domain.SystemConfig;

/**
 * 系统配置
 * 
 * @author lh
 * @version V2.0.0
 * @date 2017年05月10日 14时46分16秒 Copyright 杭州融都科技股份有限公司 统一资金接入系统 BDS All Rights
 *       Reserved 官方网站:www.erongdu.com 研发中心:rdc@erongdu.com
 *       未经授权不得进行修改、复制、出售及商业使用
 */
public class SystemConfigModel extends BasePageModel {

	/**
	 * 主键
	 */
	private Long id;
	/**
	 * 配置标识
	 */
	@NotEmpty(message = "{systemConfig.configCode.notEmpty}")
	private String configCode;
	
	/**
	 * 配置值
	 */
	@NotEmpty(message = "{systemConfig.configValue.notEmpty}")
	private String configValue;

	// 省略其他属性和getter、setter方法
}

     在Validation_zh_CN.properties文件中添加message键值对

systemConfig.configCode.notEmpty=配置项标识不能为空
systemConfig.configValue.notEmpty=配置值不能为空

 

5、在Action的方法头中为model添加@Valid注解并绑定错误信息

	/**
	 * 添加系统配置
	 * 
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/modules/system/config/doAppend", method = RequestMethod.POST)
	@ResponseBody
	public String doAppend(@Valid SystemConfigModel model, BindingResult result) throws Exception {
		Map<String, Object> data = new HashMap<>();
		try {
			if (null == model) {
				throw new RuntimeException("model can not be null!");
			}
			// 校验参数
			if(result.hasErrors()){
				data.put("result", false);
				data.put("msg", getBindErrors(result));
				return JSON.toJSONString(data);
			}
			//model.validParam();

			// 填写补充信息
			model.setCreateTime(new Date());
			model.setStatus(1);

			systemConfigService.save(model.copyToDomain());
			data.put("result", true);
			data.put("msg", "success");
		} catch (Exception e) {
			logger.error("addMer_error", e);
			data.put("result", false);
			data.put("msg", e.getMessage());
		}
		return JSON.toJSONString(data);
	}

 

	/**
	 * 取得错误信息
	 * @param bindingResult
	 * @return
	 */
	public String getBindErrors(final BindingResult bindingResult){
		final StringBuilder errorStr = new StringBuilder();
		final List<ObjectError> errors = bindingResult.getAllErrors();
		final int errorLen = errors.size()-1;
		for (int i = errorLen; i >=0 ; i--) {
			errorStr.append(errors.get(i).getDefaultMessage()).append("<br>");
		}
		return errorStr.substring(0, errorStr.length()-4);		
	}

 

分享到:
评论

相关推荐

    hibernate-validator-5.2.4.Final.jar

    《Hibernate Validator 深度解析》 Hibernate Validator 是一个基于 Bean Validation 规范的实现,是 Hibernate 项目的一部分,...无论是简单的应用场景还是复杂的业务逻辑,Hibernate Validator 都能提供强大的支持。

    hibernate-validator-4.0.1.GA-dist

    Hibernate Validator,作为Java世界中的一款强大且广泛使用的验证框架,极大地简化了应用中的数据验证过程。本文将深入探讨 Hibernate Validator 4.0.1.GA 版本,解析其核心功能与特性,以及在实际开发中的应用场景...

    hibernate-validator-5.2.2

    综上所述,Hibernate Validator 5.2.2为Java开发者提供了强大且灵活的验证功能,无论是在简单还是复杂的应用场景下,都能有效地保障数据的正确性和一致性。通过熟练掌握和运用这个框架,开发者可以更加专注于业务...

    hibernate-validator-6.0.2

    无论是简单的业务场景还是复杂的验证逻辑,Hibernate Validator 都能提供优雅的解决方案。在实际开发过程中,结合其丰富的注解和灵活的扩展性,可以大大降低数据验证的复杂度,让开发者更加专注于业务逻辑的实现。

    hibernate-validator-5.0.1.Final

    《Hibernate Validator 框架详解及其在JSR 303规范中的应用》 Hibernate Validator是Java世界中的一款强大且广泛使用的验证...无论是开发企业级应用还是简单的Java项目,Hibernate Validator都是一个不可或缺的工具。

    hibernate-validator-6.1.2.Final-dist.zip

    《Hibernate Validator:深入理解Java参数校验框架》 Hibernate Validator是Java世界中广泛...无论是在Spring MVC还是其他Java应用中,Hibernate Validator都是不可或缺的一部分,值得每一位Java开发者掌握和使用。

    hibernate-validator-annotation-processor-5.1.0.CR1.zip

    Hibernate Validator 是一个流行的开源验证框架,它基于JSR 303/JSR 349(Bean Validation)标准,为Java应用程序提供了强大的数据验证功能。"Hibernate Validator Annotation Processor 5.1.0.CR1"是该框架的一个...

    hibernate-validator-5.1.0.zip

    《深入理解Hibernate Validator在SpringMVC中的应用》 在Java Web开发中,数据校验是一项不可或缺的任务,它确保了输入数据的正确性,提升了系统的稳定性。SpringMVC框架结合JSR-303标准,利用Hibernate Validator...

    hibernate-validator

    《Hibernate Validator:企业级验证框架的精粹》 Hibernate Validator,作为Java Bean...无论是简单的业务场景还是复杂的验证需求,Hibernate Validator都能提供全面而灵活的解决方案,是企业级应用不可或缺的一部分。

    (精品推荐)hibernate-validator-3.1.0.GA.zip

    Hibernate Validator 是一个基于 Bean Validation 规范的实现,它为Java应用提供了强大的数据验证功能。在3.1.0.GA版本中,该框架不仅包含了完整的源码,丰富的示例,还附带有详细的参考文档和API,是学习和使用...

    hibernate_validator_reference 5.0.3

    Hibernate Validator是一个基于Java Bean Validation规范(JSR 349)的实现,它允许开发者通过注解的方式对Java ...对于希望深入理解Hibernate Validator及其在项目中应用的读者,本手册提供了丰富的实用信息和知识。

    Hibernate-Validator-6.2.0中文参考文档.pdf

    Hibernate Validator作为实现这些规范的库,提供了一套强大的API和注解,使得在Java应用中实现数据验证变得简单易行。例如,`@NotNull`用于检查字段是否为空,`@Size`用于限制字段长度,`@Pattern`则用于验证字符串...

    hibernate_validator_reference_5.1.3.pdf

    Hibernate Validator是一款Java验证框架,是Bean Validation 1.1(JSR-349)的参考...通过本文的详细解读,我们了解了Hibernate Validator的核心概念和应用方法,这将有助于开发者更加高效地实现复杂的数据验证逻辑。

    hibernate validator

    集成Hibernate Validator到Eclipse中是相当简单的。首先,你需要将`hibernate-validator-5.1.2.Final.jar`添加到项目的类路径中。然后,通过在Java代码中导入所需的验证注解和API,就可以开始使用它了。如果你使用的...

    hibernate validator jsr303

    Hibernate Validator广泛应用于Web应用、服务端API验证、ORM框架(如Hibernate)的数据验证等场景。通过它的强大功能,开发者可以确保输入数据的质量,避免因无效数据导致的业务错误,提高系统整体的健壮性。 总之...

    hibernate-5.4required必须的18个jar包

    3. **hibernate-validator-6.0.13.Final.jar**:实现了JSR-303和JSR-349标准,用于数据验证,确保输入数据的有效性和一致性。 4. **javassist-3.23.2-GA.jar**:Hibernate使用Javassist库动态生成和修改类字节码,...

    hibernate validator demo

    在演示项目中,可能包含了一个简单的实体类,如 `User`,它包含了使用 Hibernate Validator 注解的属性: ```java public class User { @NotNull private String name; @Size(min = 6, max = 20) private ...

    springmvc4与hibernate validation校验器完全兼容jar包

    在Spring MVC中集成Hibernate Validation,可以实现对输入数据的有效性检查,从而提升应用程序的健壮性和用户体验。 首先,让我们深入了解一下Spring MVC中的数据绑定和验证。Spring MVC支持模型驱动的数据绑定,它...

    hibernate_validator 官方参考文档

    Hibernate Validator是Java Bean Validation(JSR 303)的参考实现,它为开发者提供了一套强大的工具集,用于在应用程序中实现数据验证逻辑。这一框架不仅简化了开发流程,还提升了代码的可读性和可维护性,特别是在...

Global site tag (gtag.js) - Google Analytics