--- layout: post title: Bean Validation tags: Bean Validation Java categories: java published: true --- [BeanValidation][BeanValidation] 可以帮助开发者方便地对数据进行校验,但它只是一个标准,只有一套接口,要想使用它的功能必须选择一种实现,`hibernate-validator`是个不错的选择 ~~~xml org.hibernate hibernate-validator 5.0.2.Final ~~~ BeanValidator 可以自动扫描到hibernate-validator,而不用进行任何配置,前提是需要将hibernate-validator放到classpath下 在JAVA类中可以直接得到可用的检验器实现: ~~~ private Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); ~~~ 它是怎么做到的?笔者和你具有一样强的好奇心,深入源码后,笔者发现了这样一段代码 ~~~ private List> loadProviders(ClassLoader classloader) { ServiceLoader loader = ServiceLoader.load( ValidationProvider.class, classloader ); Iterator providerIterator = loader.iterator(); List> validationProviderList = new ArrayList>(); while ( providerIterator.hasNext() ) { try { validationProviderList.add( providerIterator.next() ); } catch ( ServiceConfigurationError e ) { // ignore, because it can happen when multiple // providers are present and some of them are not class loader // compatible with our API. } } return validationProviderList; } ~~~ 显而易见,通过`ClassLoader`可以找出所有实现了`ValidationProvider`的接口的类,这些类即为BeanValidator的实现,然后从这个列表中取第一个就行了。 BeanValidation 使用方法也非常简单,调用`validate`方法后会返回一个校验结果集,如果结果集长度为0则表示校验完全通过;否则将可以从`ConstraintViolation`中获取失败信息 ~~~ Set> constraintViolations = validator.validate(new Article()); ~~~ 当然,前提是先要定义字段的约束,`@NotNull`表示此字段的值不可为空,注解也可以在字段上,更多预置的注解在`javax.validation.constraints`包中 ~~~ @NotNull public String getTitle() { return title; } ~~~ # 与Spring集成 现在Spring4已经集成了BeanValidation,并增加了国际化支持,这个LocalValidatorFactoryBean可以注入到任何类中使用 ~~~ classpath:messages/validationMessages classpath:org/hibernate/validator/ValidationMessages ~~~ 如果你正在使用 SpringMVC 集成就更简单了 ~~~ ~~~ 然后在需要校验的Bean上注解`@Valid`,并紧随其后添加`BindingResult` ~~~ @RequestMapping(value = "release", method = RequestMethod.POST) public String release(@Valid Article article, BindingResult bindingResult, HttpSession session, ModelMap modelMap){ ... ... } ~~~ 如果想要将校验失败的信息展示在页面上可以使用el表达式, 注意el版本必须在2.2以上, s前缀指的是spring标签 ~~~ <%@taglib prefix="s" uri="http://www.springframework.org/tags" %> ~~~ ~~~ 字段错误:
${error.field}------${message}
全局错误:
${message}
~~~ --- 其实 BeanValidation的内容远不止于此,它还有很多更高级的特性,如分组校验等,详情请[点我][more] [BeanValidation]:http://beanvalidation.org/ [more]:http://www.ibm.com/developerworks/cn/java/j-lo-beanvalid/