`

spring 使用hibernate validator

 
阅读更多

ar包引用就不说了,使用也很简单,直接上代码:

public class Customer {
 @NotEmpty //make sure name is not empty
String name;
 @Range(min = 1, max = 150) //age need between 1 and 150
int age;
 //getter and setter methods
 }
 
@Controller
@RequestMapping("/customer")
public class SignUpController {
 
@RequestMapping(value = "/signup", method = RequestMethod.POST)
public String addCustomer(@Valid Customer customer, BindingResult result) {
 if (result.hasErrors()) {
return "SignUpForm";
} else {
return "Done";
}
 }
 
@RequestMapping(method = RequestMethod.GET)
public String displayCustomerForm(ModelMap model) {
 model.addAttribute("customer", new Customer());
return "SignUpForm";
 }
 
}
见:http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/
关于@Valid ,有的地方说用@ModelAttribute,没试过,@Valid可用,并且也很自然,就用@Valid了。
 
      当需要同时校验多个属性来验证一个对象或者一个属性在验证的时候需要另外的属性的信息的时候, 类级别的约束会很有用.。首先这个注解要标注在类上面
@OrderIdDateValid(message = "...")
public class HotelOrderParam {
@NotNull
...
@NotBlank
...
public boolean isParam_valid() {
...//验证逻辑
}
}
hibernate validator对属性的验证,是每设一个就验证一个,而且是通过反射获得属性值,因此修改相应的getter方面是没法控制的。一开始想着另外加个boolean类型的属性,然后这个boolean属性值就由isParam_valid()方法来赋值,结合@AssertTrue来验证。这个思路行不通,在给这个boolean属性赋值的时候,其他属性全部为null,根本无法使用。
      自定义注解如下:
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;
 
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = OrderIdDateValidValidator.class)
@Documented
public @interface OrderIdDateValid {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
在hibernate_validator_reference 文档中有说明
message属性, 这个属性被用来定义默认得消息模版, 当这个约束条件被验证失败的时候,通过此属性来输出错误信息.
groups 属性, 用于指定这个约束条件属于哪(些)个校验组(请参考第 2.3 节 “校验组”). 这个的默认值必须是Class<?>类型到空到数组.
payload 属性, Bean Validation API 的使用者可以通过此属性来给约束条件指定严重级别. 这个属性并不被API自身所使用.
      在上面那个注解下面还可以加上
Class<?> value();
注解的方法返回值只能是String、Class、基本类型、注解、枚举。不过当前不需要value()。验证器代码如下:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
 
public class OrderIdDateValidValidator implements ConstraintValidator<OrderIdDateValid, HotelOrderParam> {
@Override
public void initialize(OrderIdDateValid constraintAnnotation) {
}
 
@Override
public boolean isValid(HotelOrderParam value, ConstraintValidatorContext context) {
if (value == null) {
return true;
} else {
return value.isParam_valid();
}
}
}
 
ConstraintValidator接口泛型的后一个,是验证对象类型,很多例子是String,不过这个例子是HotelOrderParam。如果这个参数类型错误,会报如下错误:
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type
      这里是调用param自己的方法来实现验证逻辑,这样比较符合自己负责自己的事。
 
      hibernate validator默认提供了一些注解,有时候某些属性上标注有多个验证注解,如果多个位置有这样的重复设置,可以自定义个注解来组合那些注解,然进行统一标注。使用复合注解可以使用
@ReportAsSingleViolation //javax.validation.ReportAsSingleViolation;
将提示进行组合,具体说明在这里有:
http://docs.oracle.com/javaee/6/api/javax/validation/ReportAsSingleViolation.html
 
javax.validation 
Annotation Type ReportAsSingleViolation
 
@Target(value=ANNOTATION_TYPE)
@Retention(value=RUNTIME)
public @interface ReportAsSingleViolation
A constraint annotation hosting this annotation will return the composed annotation error report if any of the composing annotations fail. The error reports of each individual composing constraint is ignored.

 
      这个验证方式是spring mvc支持的,很自然,方便使用。之前还使用了一种方式,虽然没这种好,还是记录一下吧。在spring中配置
    <mvc:annotation-driven validator="validator"/>
 
    <bean name="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="traversableResolver">
            <bean class="com.xxx.utils.xxxTraversableResolver"></bean>
        </property>
    </bean>
      自定义的xxxTraversableResolver中的实现方法直接返回true,就可以了。hibernate validator中org.hibernate.validator.internal.engine.resolver下面的三个实现类DefaultTraversableResolver,JPATraversableResolver,SingleThreadCachedTraversableResolver虽然对接口有部分实现,但看起来都返回true的情况居多
import java.lang.annotation.ElementType;
import javax.validation.Path;
import javax.validation.TraversableResolver;
 
public class xxxTraversableResolver implements TraversableResolver {
 
public final boolean isReachable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) {
return true;
}
 
public final boolean isCascadable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) {
return true;
}
}
      然后有个工具类
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import com.xxx.utils.ValidateException;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
 
@Component
public class ValidateUtil {
 
    static Validator validator;
 
    @Resource
    public void setValidator(LocalValidatorFactoryBean validatorFactory) {//使用spring中定义的factory
        validator = validatorFactory.getValidator();
    }
 
    public static <T> void validate(T t) {
        Set<ConstraintViolation<T>> constraintViolations = validator.validate(t);
        if (constraintViolations.size() > 0) {
            String validateError = "";
            for (ConstraintViolation<T> constraintViolation : constraintViolations) {
                validateError += constraintViolation.getMessage() + ";";
            }
            throw new ValidateException(validateError);
        }
    }
}
其中ValidateException是自定义的异常。在controller里要手动使用ValidateUtil。这种方法在controller里没上一种方法方便,但在service层,可以用来进行手工测试。
分享到:
评论

相关推荐

    Spring MVC、hibernate validator和i18n源代码

    我的博客中的《Spring MVC、hibernate validator和i18n》文章描述的项目的源代码,该文是对Spring mvc, validation和i18n的一个入门级的tutorial。我的博客地址是http://blog.csdn.net/zjysource

    hibernate validator demo

    在 Spring 应用中,Hibernate Validator 可以与 Spring 的数据绑定和验证机制无缝集成,通过 `@Validated` 或 `@Valid` 注解,可以在控制器方法参数中自动进行验证。 总的来说,"hibernate validator demo" 提供了...

    hibernate-validator-5.0.1.Final

    Hibernate Validator可以轻松地与Spring、JSF等框架集成,实现跨层的验证。此外,它还提供了一个命令行工具,允许在不运行应用程序的情况下对Bean进行验证,这对于单元测试和持续集成尤其有用。 总结 Hibernate ...

    hibernate-validator-5.2.4.Final.jar

    Hibernate Validator 可以与 Spring 集成,通过 Spring 的 AOP(面向切面编程)实现全局的数据验证,简化了代码结构,提高了代码的可维护性。 五、性能优化 Hibernate Validator 5.2.4.Final 版本在性能上也有优化...

    Springmvc数据验证6个详细包,hibernate-validator-5.1.3.Final.jar...

    综上所述,这个压缩包包含的内容可能涵盖了Spring MVC与Hibernate Validator的集成使用,以及一个具体的用户注册登录验证示例,对于学习和理解如何在实际项目中进行数据验证具有很高的参考价值。通过深入研究这些...

    hibernate-validator-4.0.1.GA-dist

    1. Web 应用:在 MVC 框架(如 Spring MVC)中,Hibernate Validator 可以与 Model 属性结合,实现前端表单提交数据的验证。 2. RESTful API:验证 JSON 请求参数的有效性,保证服务接口的健壮性。 3. 业务逻辑:...

    hibernate-validator-5.1.3.Final-dist.zip

    使用Hibernate Validator,你可以定义一系列的约束注解,如`@NotNull`、`@Min`、`@Max`、`@Size`等,它们可以直接应用在字段或者方法上,用于检查对象的属性是否满足特定条件。例如,`@NotNull`用于检查值是否为null...

    hibernate-validator-reference4.2final

    与Spring框架的无缝集成,允许在Spring MVC中直接使用Hibernate Validator进行表单验证,简化了控制器的代码。 六、性能优化 4.2.0.Final版本对性能进行了优化,提升了大规模验证场景下的效率,并且增加了对CDI...

    Hibernate Validator校验框架

    使用 Hibernate Validator 需要引入对应的依赖库,包括 Hibernate Validator 和 Bean Validation API。 2.2 SpringMvc 中配置 在 Spring MVC 中,可以通过配置 Hibernate Validator 的约束注解处理器,使其自动处理...

    springmvc 使用hibernate-validator校验包

    本文将深入探讨如何在Spring MVC项目中集成并使用Hibernate Validator来实现高效、强大的数据校验功能。 一、 Hibernate Validator简介 Hibernate Validator是Hibernate组织开发的一个开源项目,它是JSR 380(Java...

    hibernateValidator4的用法

    hibernate validator 4.2的集成spring3.0.5一下版本的样例工程。 自己学习hibernate validator写的。 倘若使用spring3.1以上的版本,有些不同。其中MethodValidateInterceptor就是以spring3.1中的参考。 自己再研究...

    hibernate-validator-6.0.2

    在本文中,我们将深入探讨 Hibernate Validator 的核心概念、使用方法以及其在实际开发中的重要作用。 首先,让我们了解一下 Hibernate Validator 的基本知识。Hibernate Validator 是 Hibernate 组织的一员,它...

    SpringBoot 使用hibernate validator校验

    SpringBoot 使用 Hibernate Validator 校验 Hibernate Validator 是 Java 中的一个验证框架,提供了许多有用的 注解来验证对象的属性。SpringBoot 项目中可以使用 Hibernate Validator 来实现数据验证。本文将详细...

    Hibernate Validator校验框架Demo

    4. **控制器处理**:在控制器方法中,使用`@Valid`注解标记需要验证的参数,Spring会自动调用Hibernate Validator进行验证。 ```java @RequestMapping(method = RequestMethod.POST) public String register(@Valid...

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

    - 集成Hibernate Validator到Spring或EJB项目中,了解如何配置和使用验证器。 - 学习如何创建和使用自定义验证注解,以满足更复杂的业务需求。 - 熟悉错误处理机制,如何优雅地展示验证失败的信息给用户。 7. **...

    后台验证hibernate-validator必须的jar包

    `Hibernate Validator`是Java领域中最常用的验证框架之一,尤其在与Spring等框架结合使用时,能够方便地实现复杂的数据验证规则。本主题将详细讲解`Hibernate Validator`以及与之相关的`validation-api-2.0.1.Final....

    hibernate-validator-demo

    2. **配置文件**:在Spring Boot等框架中,可能有一个`application.properties`或`application.yml`文件,用于配置Hibernate Validator的行为,例如定制错误消息模板。 3. **实体类(Entity)**:项目中会有代表...

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

    6. **与Spring和其他框架的集成**:Hibernate Validator可以无缝集成到Spring框架中,也可以与其他Java EE应用服务器配合使用。 7. **编程式验证**:除了基于注解的方式,文档还介绍了如何通过API进行编程式的验证...

    hibernate-validator-6.0.8

    在本文中,我们将深入探讨Hibernate Validator 6.0.8的关键特性、使用方法以及它如何在实际项目中提升代码质量和用户体验。 一、Hibernate Validator概述 Hibernate Validator是Hibernate组织的一部分,它实现了...

    Struts Hibernate Spring 集成开发宝典 validator

    《Struts Hibernate Spring 集成开发宝典》是一本深度探讨企业级Java应用开发的著作,重点关注了三个核心框架的整合使用:Struts、Hibernate和Spring。这三大框架是Java Web开发中的重要组成部分,各自在不同的层面...

Global site tag (gtag.js) - Google Analytics