概述
上一篇通过Spring MVC+Freemaker整合一个国际化实现demo,同时demo里还整合了Spring MVC自带的bean验证Validator,需要自己去实现验证逻辑。本篇主要内容Spring MVC+hibernate-validator bean实现国际化表单验证,相关代码已上传Githut,地址见文章结尾。
hibernate-validator 验证框架整合
提到bean验证,不得不说下JSR bean validation规范(JSR303、JSR349),这个规范只是定义了对象属性约束说明,没有具体实现。hibernate-validator就是实现了这个规范的框架之一,另外bean validation 1.1对JSR349进行了实现,但据说还不够稳定。2016年中bean validation 2.0发布,发布说明:http://beanvalidation.org/news/2016/07/15/bean-validation-2-0-is-coming/。相对而言hibernate-validator更成熟,这里采用hibernate-validator进行demo搭建(版本5.2.4.Final)。
采用hibernate-validator验证框架比spring mvc自带的验证框架好用,首先不需要自己实现验证逻辑,hibernate已经帮我们实现了;其次hibernate-validator验证框架可以完全基于注解,使用更加方便灵活。
首先看下JSR303约束注解标签,以及基本用法:
按照以上讲解的注解格式,为上一章的User类中需要验证的字段进行相应注解添加(在上一章的代码里进行修改):
/** * Created by gantianxing on 2017/6/8. */ public class User implements Serializable { private static final long serialVersionUID = 1L; @NotNull @Size(min=2,max = 5) private String name;//姓名 @NotNull @Past private Date birthday;//生日 @NotNull @Digits(integer=3,fraction=2) private BigDecimal money;//资产 @NotNull @Pattern(regexp="\\d{11}") private String phoneNum;//手机号 public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public BigDecimal getMoney() { return money; } public void setMoney(BigDecimal money) { this.money = money; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } }
具体注解含义就不解释了,根据上面的规则讲解,一目了然。
启动tomcat,访问http://localhost/add,如下:
每个字段都不填写值,直接点击”添加”按钮:
切换化到英文:
可以看到验证框架,有一套自己默认的错误提示信息,并且已经支持了国际化(这里我只试了中文和英文)。
整合国际化配置文件
一般情况下你对默认的错误提示信息会不满意,别紧张,Spring MVC可以很好的把hibernate-validator验证器与国际化配置整合起来。整合分三步:
第一步:首先我们要修改User类的注解,把错误消息的key指定为国际化属性配置文件中的key,如下:
public class User implements Serializable { private static final long serialVersionUID = 1L; @NotNull(message="{user.name.null}") @Size(min=2,max =5,message = "{user.name.error}") private String name;//姓名 @NotNull(message="{user.birthday.null}") @Past(message="{user.birthday.error}") private Date birthday;//生日 @NotNull(message="{user.money.null}") @Digits(integer=3,fraction=2,message="{user.money.error}") private BigDecimal money;//资产 @NotNull(message="{user.phoneNum.null}") @Pattern(regexp="\\d{11}",message="{user.phoneNum.error}") private String phoneNum;//手机号 public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public BigDecimal getMoney() { return money; } public void setMoney(BigDecimal money) { this.money = money; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } }
第二步:再修改spring-mvc.xml配置文件,整合hibernate-validator验证器与国际化配置:
<mvc:annotation-driven validator="validator" conversion-service="formatService" /> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> <!--指定国际化配置文件 不设置则默认为classpath下的 ValidationMessages.properties --> <property name="validationMessageSource" ref="messageSource"/> </bean> <!-- formatter转换配置 --> <bean id="formatService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="formatters"> <set> <bean class="com.sky.locale.demo.formatter.MyDateFormatter" /> <bean class="com.sky.locale.demo.formatter.MyCurrencyFormatter" /> </set> </property> </bean> <!-- 国际化资源文件 --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basenames" > <list> <value>/WEB-INF/resource/usermsg</value> <value>/WEB-INF/resource/userlabels</value> </list> </property> <property name="defaultEncoding" value="UTF-8"/> </bean>
第三步:在属性配置文件中添加自定义的国家化消息,在中文usermsg_zh_CN.properties配置中添加:
user.name.null=请输入用户名 user.name.error=用户名长度必须在{min}到{max}之间 user.birthday.null=请输入生日 user.birthday.error=生日必须小于当前时间 user.money.null=请输入资产 user.money.error=资产不能超过1000000 user.phoneNum.null=请输入手机号 user.phoneNum.error=手机号必须为11位
在英文配置文件usermsg_en_GB.properties中添加:
user.name.null=Please enter a name user.name.error=name length must between{min} and {max} user.birthday.null=Please enter a birthday user.birthday.error=birthday is a past time user.money.null=Please enter a money user.money.error=money < 1000000 user.phoneNum.null=Please enter a phoneNum user.phoneNum.error=phoneNum length is 11
ok, 修改完毕,重新启动tomcat,访问http://localhost/add,不填写任何字段,提交表单,显然如下:
切换到英文(ps:如果切换不成功,tomcat版本请换成tomcat8以上),再次提交表单:
可以看到结果是我们想要的,hibernate-validator验证器与Spring MVC国际化配置整合完成。以上示例代码详见Github地址:https://github.com/gantianxing/locale-demo1.git
相关推荐
1. Web 应用:在 MVC 框架(如 Spring MVC)中,Hibernate Validator 可以与 Model 属性结合,实现前端表单提交数据的验证。 2. RESTful API:验证 JSON 请求参数的有效性,保证服务接口的健壮性。 3. 业务逻辑:...
在实际开发中,Hibernate Validator常用于Web表单验证、服务层的数据校验以及数据库操作前的数据预处理。例如,你可以这样做: ```java public class User { @NotNull(message = "用户名不能为空") private ...
3. 国际化:Hibernate Validator支持多语言的错误消息,方便根据不同地区展示不同的错误提示。 4. 组验证:允许对一组相关的验证注解进行分组,根据业务逻辑选择执行特定的验证组。 三、使用 Hibernate Validator ...
1. **表单验证**:在Web应用中,对用户提交的数据进行前端和后端双重验证。 2. **服务层验证**:在服务调用之间,确保输入数据的合法性和一致性。 3. **数据持久化**:在对象保存到数据库之前,先进行验证,避免...
当结合Hibernate Validator使用时,可以在CDI上下文中轻松地进行验证操作,比如在处理用户表单提交时,可以直接在服务层或者控制器层利用验证注解进行数据校验。 在这个5.1.0.Final版本中,可能包含了如下内容: 1....
2. Web表单验证:在Web应用中,结合前端框架,如AngularJS或Vue.js,可以在客户端和服务器端同时进行数据验证,提高用户体验。 3. 服务端验证:在RESTful API开发中,验证请求参数的有效性,防止非法数据的注入,...
与Spring框架的无缝集成,允许在Spring MVC中直接使用Hibernate Validator进行表单验证,简化了控制器的代码。 六、性能优化 4.2.0.Final版本对性能进行了优化,提升了大规模验证场景下的效率,并且增加了对CDI...
总结来说,Hibernate Validator 是一个强大且灵活的验证工具,它简化了 Java 应用中的数据验证过程,提高了代码质量,降低了潜在的错误风险。熟练掌握 Hibernate Validator,可以让你的 Java 应用更加健壮和安全。
用户填写的表单数据以JSON格式发送到服务器,`SpringMVC`的`@RequestBody`注解将JSON数据转换为Java对象,`Hibernate Validator`自动进行验证,如果验证失败则返回错误信息,否则继续处理业务逻辑。`Fastjson`在这里...
总结来说,基于Hibernate Validator的异步表单校验框架能够帮助开发者高效、灵活地实现数据验证,提升用户体验,同时保持代码的整洁和模块化。正确地使用这个框架,可以避免因为数据验证问题而导致的各种异常情况,...
综上所述,Hibernate Validator作为Java领域内领先的验证框架,不仅提供了丰富的内置约束,还支持高度定制化的自定义约束,同时与众多生态系统中的其他框架紧密集成,使得数据验证变得更加简单、高效且强大。...
总结起来,结合SpringMVC和Hibernate-validator,利用自定义JSP标签库可以自动化生成前端JavaScript验证代码,提升开发效率,降低出错概率,提供更优的用户体验。这一技术在实际项目中非常实用,值得在开发过程中...
通过以上内容的学习,我们可以看到 **Hibernate Validator** 提供了丰富的功能和高度可定制化的验证能力,非常适合于各种规模的 Java 应用程序开发。无论是简单的数据类型验证还是复杂的业务逻辑验证,都能够轻松...
Java作为服务器端的主要编程语言之一,在处理前端表单验证时有着丰富的工具和技术。 #### 二、表单验证的重要性 1. **数据完整性**:确保提交的数据是完整且有效的。 2. **用户体验**:减少用户因输入错误而导致的...
Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。 该压缩包包含了hibernate-validator-5.2.4.Final.jar、hibernate-validator-annotation-processor-5.2.4.Final.jar、...
它支持多种验证场景,如Web表单验证、XML数据验证等。在`commons-validator-1.7-bin.tar.gz`这个压缩包中,包含了Validator的1.7版本的所有相关文件,便于开发者下载和使用。 首先,我们来了解Validator的核心组件...
Validator规则可以通过XML配置文件或注解进行定义,可以自定义错误消息,提供了一种灵活且可扩展的方式来处理表单验证。 在实际的集成开发过程中,Struts负责处理用户请求并控制流程,Hibernate处理数据库操作,...
在实际开发中,Hibernate Validator 可以广泛应用于Web表单验证、业务逻辑校验等场景,有效避免因无效数据引发的程序错误。通过合理使用和自定义验证规则,可以提高代码质量,减少bug,提升用户体验。同时,其良好的...