第9章 数据校验

痞子三分冷 提交于 2019-12-25 20:25:18

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

JSR 303

  • JSR 303是Java为Bean的数据合法性校验提供的标准框架,它已包含在了JavaEE 6.0中。
  • JSR 303通过在Bean属性上标注类似于@NotNull@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。

Hibernate Validator的扩展注解

  • Hibernate Validator是JSR 303的一个参考实现。除支持所有标准的校验注解外,还支持以下的扩展注解。

Spring MVC数据校验

  • Spring拥有自己独立的数据校验框架,同时还支持JSR 303标准的校验框架。
  • Spring在进行数据绑定时,可同时调用校验框架完成数据校验工作。 在Spring MVC 中,可直接通过注解的方式进行数据校验。
  • Spring的LocalValidatorFactroyBean既实现了Spring的Validator接口,也实现了JSR 303的Validator接口。只要在Spring容器中定义了一个LocalValidatorFactoryBean,即可将其注入到需要数据校验的Bean中。
  • Spring本身并没有提供JSR 303的实现,所以必须将JSR 303的实现者的jar 包放到类路径下。
  • <mvc:annotation-driven/>会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标注@valid注解即可让Spring MVC在完成数据绑定后执行数据校验的工作。
  • 在已经标注了JSR 303注解的表单/命令对象前标注一个@Valid,Spring MVC框架在将请求参数绑定到该入参对象后,就会调用校验框架根据注解声明的校验规则实施校验。
  • Spring MVC是通过对处理方法签名的规约来保存校验结果的。前一个表单/命令对象的校验结果保存到随后的入参中,这个保存校验结果的入参必须是BindingResultErrors类型,这两个类都位于org.springframework.validation包中。
  • 需校验的Bean对象和其绑定结果对象或错误对象时成对出现的,它们之间不允许声明其他的入参。
  • Errors接口提供了获取错误信息的方法。如getErrorCount()getFieldErrors(String field)
  • BindingResult扩展了Errors接口。

获取校验结果

  • 在表单/命令对象类的属性中标注校验注解,在处理方法对应的入参前添加@Valid,Spring MVC就会实施校验并将校验结果保存在被校验入参对象之后的 BindingResultErrors入参中。
  • 常用方法:
    • FieldError getFieldError(String field)
    • List<FieldError> getFieldErrors()
    • Object getFieldValue(String field)
    • int getErrorCount()

显示校验错误

  • Spring MVC除了会将表单/命令对象的校验结果保存到对应的BindingResultErrors对象中外,还会将所有校验结果保存到隐含模型
  • 即使处理方法的签名中没有对应于表单/命令对象的结果入参,校验结果也会保存在隐含对象中。
  • 隐含模型中的所有数据最终将通过HttpServletRequest的属性列表暴露给JSP视图对象。因此,在JSP中可以获取错误信息。
  • 在JSP页面上可通过<form:errors path="userName" />显示错误消息。

示例

提示消息的国际化(了解)

  • 每个属性在数据绑定和数据校验发生错误时,都会生成一个对应的FieldError对象。
  • 当一个属性校验失败后,校验框架会为该属性生成4个消息代码,这些代码以校验注解类名为前缀,结合modleAttribute、属性名及属性类型名生成多个对应的消息代码。
    • 例如:User类中的password属性标准了一个@Pattern注解,当该属性值不满足@Pattern所定义的规则时, 就会产生以下4个错误代码:
      • Pattern.user.password
      • Pattern.password
      • Pattern.java.lang.String
      • Pattern
  • 当使用Spring MVC标签显示错误消息时,Spring MVC会查看WEB上下文是否装配了对应的国际化消息。如果没有,则显示默认的错误消息,否则使用国际化消息。
  • 若数据类型转换或数据格式转换时发生错误,或该有的参数不存在,或调用处理方法时发生错误,都会在隐含模型中创建错误消息。其错误代码前缀说明如下:
    • required:必要的参数不存在。如@RequiredParam("param1")标注了一个入参,但是该参数不存在。
    • typeMismatch:在数据绑定时,发生数据类型不匹配的问题。
    • methodInvocation:Spring MVC在调用处理方法时发生了错误。
  • 注册国际化资源文件

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!