`

SpringMVC杂记(五) JSR303数据验证

阅读更多
SpringMVC杂记(五) JSR303数据验证

1) 首先JSR303的实现必须加入CLASSPATH
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>4.2.0.Final</version>
</dependency>


2) SpringMVC 中的配置
<mvc:annotation-driven validator="validator"/>

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />


3) 关于JSR303给出的默认标注和Hibernate可以参考hibernate-validator官方文档
我的另一篇博客也简要介绍了一下


4) 自己实现验证规则
4.1 自定义元注释
package com.wicresoft.jpo.demo.validator;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD})
@Constraint(validatedBy = {BetweenImplForDate.class})
public @interface Between {

	public String message();

	public String startDate();

	public String endDate();

	public String format() default "yyyy-MM-dd";

	public Class<?>[] groups() default {};

	Class<? extends Payload>[] payload() default {};
}

  4.2 验证器实现类
package com.wicresoft.jpo.demo.validator;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class BetweenImplForDate implements ConstraintValidator<Between, Date> {

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

	private Date startDate;
	private Date endDate;
	private DateFormat dateFormat;

	public void initialize(Between annotation) {
		this.dateFormat = new SimpleDateFormat(annotation.format());
		try {
			this.startDate  = dateFormat.parse(annotation.startDate());
			this.endDate    = dateFormat.parse(annotation.endDate());
		} catch (ParseException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		}
	}

	public boolean isValid(Date value, ConstraintValidatorContext context) {
		LOGGER.debug("value = {}", dateFormat.format(value));
		return (startDate.getTime() <= value.getTime()) && (value.getTime() < endDate.getTime());
	}
}


  4.3 添加国际化支持,让错误信息配置在i18n文件里。SpringMVC配置文件改成如下。
v.login.birthday=生日不合法,生日应在{startDate}与{endDate}之间。

<mvc:annotation-driven conversion-service="conversion-service" validator="validator">
	<mvc:message-converters register-defaults="false">
		<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
		<bean class="org.springframework.http.converter.FormHttpMessageConverter" />
		<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
		<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
		<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
		<bean class="com.wicresoft.jpo.demo.http.converter.UTF8StringHttpMessageConverter" />
	</mvc:message-converters>
</mvc:annotation-driven>

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
	<property name="validationMessageSource" ref="messageSource" />
</bean>

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
	<property name="defaultEncoding" value="UTF-8" />
	<property name="basenames">
		<list>
			<value>classpath:com/wicresoft/jpo/demo/i18n/v</value>
		</list>
	</property>
</bean>

...
<tr>
	<td>生日</td>
	<td><form:input path="birthday" /></td>
	<td><form:errors path="birthday" /></td>
</tr>
...


5) 使用标注
public class UserRegistForm implements java.io.Serializable {

	private static final long serialVersionUID = -5471272011192637665L;

	private String username;
	private String password;
	private String sex;

	@DateTimeFormat(pattern = "yyyy-MM-dd")
	// message 就是国际化文件中的key
	@Between(startDate = "1930-01-01", endDate = "2012-12-31", message = "{v.login.birthday}")
	private Date birthday;

	private String phoneNumber;
	private String emailAddress;
	private List<String> interests = new ArrayList<String>();

	// getter and setter
}


6) 效果图
分享到:
评论
4 楼 richardww123 2012-12-21  
谢谢,不错。 
3 楼 剑走天涯 2012-09-12  
hao  
2 楼 qq545485196 2012-06-11  
犀利啊
1 楼 huqing2010 2012-04-11  
demo 很给力 正需要用一下 thanks!

相关推荐

    springmvc_jsr303

    项目中所需的jar包在压缩包中已提供,项目中用到了JSR303和hibernate-validator的技术,大量采用了注解@NotNull,@Email,@Length,@Max,@Pattern,@Size等,此外还采用了自定义注解,验证信息全部配置在属性文件中.

    SpringMVC使用JSR-303进行验证Bean.docx

    SpringMVC框架结合JSR-303(也称为JSR-349,Java Bean Validation)规范提供了一种优雅的方式来处理数据验证。本篇文章将详细介绍如何在SpringMVC中使用JSR-303进行Bean验证。 首先,我们需要引入JSR-303的实现库。...

    springmvc表单验证JSR-303验证框架jar包

    hibernate-validator-5.2.4.Final.jar hibernate-validator-annotation-processor-5.2.4.Final.jar hibernate-validator-cdi-5.2.4.Final.jar validation-api-1.1.0.Final.jar jboss-logging-3.2.1.Final.jar ...

    SpringMVC JSR303数据校验DEMO(附:JSR303的JAR包)

    当用户提交数据时,SpringMVC会自动调用JSR303验证器,如果输入不符合预设规则,系统将抛出异常并返回错误信息。 JSR303的JAR包通常包含了核心验证API(javax.validation.*)和实现,如Hibernate Validator,它是...

    【源码】SpringMVC与SiteMesh2.4无缝整合并借助JSR303规范实现表单验证

    这是我的这篇博文的源码:SpringMVC与SiteMesh2.4无缝整合并借助JSR303规范实现表单验证,博文地址:http://blog.csdn.net/jadyer/article/details/7574668

    springmvc&JSR303;的jar包

    Spring MVC是Spring框架的一部分,用于构建MVC(Model-View-Controller)架构的Web应用,而JSR303(Java Bean Validation)则提供了一种标准的数据验证机制。 Spring MVC详解: Spring MVC 是一个轻量级的MVC框架,...

    ( SpringMVC 数据的格式化、JSR 303数据校验和国际化 实例.zip

    SpringMVC 数据的格式化、JSR 303数据校验和国际化 实例.zip 对应博客:http://blog.csdn.net/peng_hong_fu/article/details/53559773

    SpringMVC入门很简单之数据验证

    SpringMVC提供了多种方式进行数据验证,包括使用JSR-303/JSR-349(Bean Validation)标准以及自定义验证注解。 1. **使用JSR-303/JSR-349 (Bean Validation)** Bean Validation 提供了一种统一的验证API,允许在...

    JSR303jar包 使用的是Hibernate

    总的来说,JSR303和Hibernate Validator为Java开发带来了标准化的数据验证解决方案,它们与SpringMVC的整合使得Web应用的数据校验变得更加简洁、高效。在实际开发中,正确理解和使用这些工具,能够有效地提升应用的...

    springmvc使用JSR-303进行数据校验实例

    SpringMVC结合JSR-303可以实现对数据的有效验证,确保接收到的数据是符合业务要求的。接下来,我们会详细讲解如何在SpringMVC项目中集成JSR-303进行数据校验。 首先,我们来看如何集成JSR-303到SpringMVC项目中。...

    SpringMVC 使用JSR-303进行校验 @Valid示例

    使用SpringMVC结合JSR-303进行数据校验的流程一般包括以下几个步骤: 1. 准备校验时使用的JAR包:在项目中添加validation-api和具体的实现库(如hibernate-validator),用于执行校验规则。 2. 编写需要校验的Java...

    JSR303数据效验.rar

    Spring MVC 数据效验 jar包 :classmate-1.1.0.jar,hibernate-validator-5.2.4.Final.jar,hibernate-validator-annotation-processor-5.2.4.Final.jar,hibernate-validator-cdi-5.2.4.Final.jar,jboss-logging-3.2.1....

    jsr303jar包.zip

    JSR303用到的jar包,本人使用的,现分享给大家,希望能给大家带来帮助 classmate-0.8.0.jar hibernate-validator-5.0.0.CR2.jar hibernate-validator-annotation-processor-5.0.0.CR2.jar jboss-logging-3.1.1...

    springmvc数据验证jar包

    这个"springmvc数据验证jar包"正是为了实现这一功能而必备的组件。它包含了多个关键库,如Hibernate Validator、JBoss Logging和Validation API,这些库协同工作以确保输入数据的有效性,从而增强应用程序的安全性和...

    springmvc数据验证

    Spring MVC 提供了两种主要的数据验证方式:一种是基于JSR 303/349的Bean Validation,另一种是基于Validator接口的自定义验证。 1. **Bean Validation**:这是一个标准的Java Bean数据验证框架,它定义了一组注解...

    Spring验证器+JSR303.rar

    使用SpringMVC的验证器完成货物入库输入校验。验证入库时间,以及商品价格是否合理等。主要用到的JSR303中:@Past:验证Date和Calender对象是否在当前时间之前。@Pattern:验证String对象是否符合正则表达式的规则。

    跟开涛学SpringMVC(7.3)SpringMVC数据

    在SpringMVC中,数据验证通常通过使用JSR-303/JSR-349(Bean Validation)规范实现,该规范定义了一套标准的注解,如`@NotNull`、`@Size`、`@Pattern`等,用于验证对象属性。开发者可以在模型类的字段上添加这些注解...

    springmvc注解式控制器的数据验证、类型转换及格式化 SpringMVC数据验证

    Spring MVC通过集成JSR 303/349(Java Bean Validation)规范,使得我们可以在模型属性上定义验证规则,如`@NotNull`、`@Size`、`@Pattern`等。当控制器接收到请求后,Spring会自动进行数据验证,并在验证失败时抛出...

    SpringMVC杂记(三) 向导型Controller的实现(基于SpringMVC 3.1.1)

    在实际应用中,我们可能还需要考虑错误处理、回退机制以及数据验证等问题,以确保向导流程的健壮性和用户体验。在开发过程中,SpringMVC的强大功能和灵活性将帮助我们构建出高效、易于维护的Web应用程序。

Global site tag (gtag.js) - Google Analytics