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 深度解析》 Hibernate Validator 是一个基于 Bean Validation 规范的实现,是 Hibernate 项目的一部分,...无论是简单的应用场景还是复杂的业务逻辑,Hibernate Validator 都能提供强大的支持。
Hibernate Validator,作为Java世界中的一款强大且广泛使用的验证框架,极大地简化了应用中的数据验证过程。本文将深入探讨 Hibernate Validator 4.0.1.GA 版本,解析其核心功能与特性,以及在实际开发中的应用场景...
综上所述,Hibernate Validator 5.2.2为Java开发者提供了强大且灵活的验证功能,无论是在简单还是复杂的应用场景下,都能有效地保障数据的正确性和一致性。通过熟练掌握和运用这个框架,开发者可以更加专注于业务...
无论是简单的业务场景还是复杂的验证逻辑,Hibernate Validator 都能提供优雅的解决方案。在实际开发过程中,结合其丰富的注解和灵活的扩展性,可以大大降低数据验证的复杂度,让开发者更加专注于业务逻辑的实现。
《Hibernate Validator 框架详解及其在JSR 303规范中的应用》 Hibernate Validator是Java世界中的一款强大且广泛使用的验证...无论是开发企业级应用还是简单的Java项目,Hibernate Validator都是一个不可或缺的工具。
《Hibernate Validator:深入理解Java参数校验框架》 Hibernate Validator是Java世界中广泛...无论是在Spring MVC还是其他Java应用中,Hibernate Validator都是不可或缺的一部分,值得每一位Java开发者掌握和使用。
Hibernate Validator 是一个流行的开源验证框架,它基于JSR 303/JSR 349(Bean Validation)标准,为Java应用程序提供了强大的数据验证功能。"Hibernate Validator Annotation Processor 5.1.0.CR1"是该框架的一个...
《深入理解Hibernate Validator在SpringMVC中的应用》 在Java Web开发中,数据校验是一项不可或缺的任务,它确保了输入数据的正确性,提升了系统的稳定性。SpringMVC框架结合JSR-303标准,利用Hibernate Validator...
《Hibernate Validator:企业级验证框架的精粹》 Hibernate Validator,作为Java Bean...无论是简单的业务场景还是复杂的验证需求,Hibernate Validator都能提供全面而灵活的解决方案,是企业级应用不可或缺的一部分。
Hibernate Validator 是一个基于 Bean Validation 规范的实现,它为Java应用提供了强大的数据验证功能。在3.1.0.GA版本中,该框架不仅包含了完整的源码,丰富的示例,还附带有详细的参考文档和API,是学习和使用...
Hibernate Validator是一个基于Java Bean Validation规范(JSR 349)的实现,它允许开发者通过注解的方式对Java ...对于希望深入理解Hibernate Validator及其在项目中应用的读者,本手册提供了丰富的实用信息和知识。
Hibernate Validator作为实现这些规范的库,提供了一套强大的API和注解,使得在Java应用中实现数据验证变得简单易行。例如,`@NotNull`用于检查字段是否为空,`@Size`用于限制字段长度,`@Pattern`则用于验证字符串...
Hibernate Validator是一款Java验证框架,是Bean Validation 1.1(JSR-349)的参考...通过本文的详细解读,我们了解了Hibernate Validator的核心概念和应用方法,这将有助于开发者更加高效地实现复杂的数据验证逻辑。
集成Hibernate Validator到Eclipse中是相当简单的。首先,你需要将`hibernate-validator-5.1.2.Final.jar`添加到项目的类路径中。然后,通过在Java代码中导入所需的验证注解和API,就可以开始使用它了。如果你使用的...
Hibernate Validator广泛应用于Web应用、服务端API验证、ORM框架(如Hibernate)的数据验证等场景。通过它的强大功能,开发者可以确保输入数据的质量,避免因无效数据导致的业务错误,提高系统整体的健壮性。 总之...
3. **hibernate-validator-6.0.13.Final.jar**:实现了JSR-303和JSR-349标准,用于数据验证,确保输入数据的有效性和一致性。 4. **javassist-3.23.2-GA.jar**:Hibernate使用Javassist库动态生成和修改类字节码,...
在演示项目中,可能包含了一个简单的实体类,如 `User`,它包含了使用 Hibernate Validator 注解的属性: ```java public class User { @NotNull private String name; @Size(min = 6, max = 20) private ...
在Spring MVC中集成Hibernate Validation,可以实现对输入数据的有效性检查,从而提升应用程序的健壮性和用户体验。 首先,让我们深入了解一下Spring MVC中的数据绑定和验证。Spring MVC支持模型驱动的数据绑定,它...
Hibernate Validator是Java Bean Validation(JSR 303)的参考实现,它为开发者提供了一套强大的工具集,用于在应用程序中实现数据验证逻辑。这一框架不仅简化了开发流程,还提升了代码的可读性和可维护性,特别是在...