SpringMVC集成Hibernate Validator进行参数校验
2018-02-07 19:20
555 查看
1、JSR303
JSR303是java为Bean数据合法性校验所提供的标准框架,它已经包含在java EE6.0中。JSR303通过在Bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。
Hibernate Validator是JSR303的一个参考实现,除支持所有标准的校验注解外,它还支持扩展注解。
2、Spring校验框架
Spring3.0拥有自己独立的数据校验框架,同时支持JSR303标准的校验框架。Spring的DataBinder在进行数据绑定时,可同时调用校验框架完成数据校验工作。
Spring的org.springframework.validator是校验框架所在的包,LocalValidatorFactoryBean既实现了Spring的Validator接口,也实现了JSR 303的Validator接口。只要在Spring容器中定义一个LocalValidatorFactoryBean,即可将其注入到需要数据校验的Bean中。
<mvc:annotation-driven validator="validator"/>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
</bean> Spring本身没有提供JSR303的实现,所以必须将JSR303的实现者(如Hibernate
Validator)的jar文件放到类路径下,Spring将其自动加载并装配好JSR 303的实现者。
3、SpringMVC数据校验
<mvc:annotation-driven />默认的会装配好一个LocalValidatorFactoryBean,通过在方法参数上标注@Valid注解即可让Spring
MVC在完成数据绑定后执行数据校验的工作,例:
首先在bean上注解规则
public class AccountParam {
@NotBlank(message = "{username}")
private String username;
@NotBlank(message = "{passwd}")
private String passwd;
@NotNull
@Pattern(regexp = ".*(?=.*\\d)(?=.*[a-zA-Z])(?=.*[~!@#$%^&*_]).{8,}")
private String newpasswd;
@NotBlank(message = "{confirmpasswd}")
private String confirmpasswd;
}
在Controller中对方法参数注解声明校验
需要校验的表单/命令对象和其绑定结果对象或错误对象是成对出现的,他们之间不允许声明其他的入参。
4、组校验
有的时候,我们对一个实体类需要有多种验证方式,在不同的情况下使用不同的验证方式,比如说对于网络配置来说,静态地址配置方式需要我们队ip、子网掩码、网段等格式进行校验,而DHCP时不需要输入这些。当一个Bean需要不同的校验规则时就需要分组。
首先定义两个组
public interface DhcpGroup {
}
public interface StaticGroup {
}
在实体类由组区分不同的规则
//静态配置网络
@RequestMapping(value = "/set-netconfig-static", method = RequestMethod.POST)
@ResponseBody
public AjaxResult setNetconfigStatic(HttpServletRequest request, @Validated({StaticGroup.class}) NetworkParam networkParam, BindingResult bindingResult) throws IOException {
logger.info("NetconfigController setNetConfigStatic:/set-netconfig-static?params={}", networkParam.toString());
if (bindingResult.hasErrors()) {
return AjaxResult.errorParam();
}
}
控制组的校验顺序
@GroupSequence({Group1.class,Group2.class,User.class})来控制校验顺序,即先校验group1再校验group2
参考:
https://www.jianshu.com/p/fc6c20af759a https://www.cnblogs.com/hujihon/p/5357481.html
JSR303是java为Bean数据合法性校验所提供的标准框架,它已经包含在java EE6.0中。JSR303通过在Bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。
Hibernate Validator是JSR303的一个参考实现,除支持所有标准的校验注解外,它还支持扩展注解。
2、Spring校验框架
Spring3.0拥有自己独立的数据校验框架,同时支持JSR303标准的校验框架。Spring的DataBinder在进行数据绑定时,可同时调用校验框架完成数据校验工作。
Spring的org.springframework.validator是校验框架所在的包,LocalValidatorFactoryBean既实现了Spring的Validator接口,也实现了JSR 303的Validator接口。只要在Spring容器中定义一个LocalValidatorFactoryBean,即可将其注入到需要数据校验的Bean中。
<mvc:annotation-driven validator="validator"/>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
</bean> Spring本身没有提供JSR303的实现,所以必须将JSR303的实现者(如Hibernate
Validator)的jar文件放到类路径下,Spring将其自动加载并装配好JSR 303的实现者。
3、SpringMVC数据校验
<mvc:annotation-driven />默认的会装配好一个LocalValidatorFactoryBean,通过在方法参数上标注@Valid注解即可让Spring
MVC在完成数据绑定后执行数据校验的工作,例:
首先在bean上注解规则
public class AccountParam {
@NotBlank(message = "{username}")
private String username;
@NotBlank(message = "{passwd}")
private String passwd;
@NotNull
@Pattern(regexp = ".*(?=.*\\d)(?=.*[a-zA-Z])(?=.*[~!@#$%^&*_]).{8,}")
private String newpasswd;
@NotBlank(message = "{confirmpasswd}")
private String confirmpasswd;
}
在Controller中对方法参数注解声明校验
/修改密码 @RequestMapping(value = "/update-account", method = RequestMethod.POST) @ResponseBody public AjaxResult updateUserPasswd(HttpServletRequest request, @Valid AccountParam accountParam, BindingResult bindingResult) { logger.info("AccountController updateUserPasswd:/update-account?param={}", accountParam.toString()); if (bindingResult.hasErrors()) { return AjaxResult.errorParam(); } }
需要校验的表单/命令对象和其绑定结果对象或错误对象是成对出现的,他们之间不允许声明其他的入参。
4、组校验
有的时候,我们对一个实体类需要有多种验证方式,在不同的情况下使用不同的验证方式,比如说对于网络配置来说,静态地址配置方式需要我们队ip、子网掩码、网段等格式进行校验,而DHCP时不需要输入这些。当一个Bean需要不同的校验规则时就需要分组。
首先定义两个组
public interface DhcpGroup {
}
public interface StaticGroup {
}
在实体类由组区分不同的规则
public class NetworkParam { @NotBlank private String eth; @NotNull(groups = {StaticGroup.class,DhcpGroup.class}) @Pattern(regexp = "^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])$", groups = StaticGroup.class) private String ip; @NotNull(groups = {StaticGroup.class,DhcpGroup.class}) @Pattern(regexp = "^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])$", groups = StaticGroup.class) private String netmask; @NotNull(groups = {StaticGroup.class,DhcpGroup.class}) @Pattern(regexp = "^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])$", groups = StaticGroup.class) private String gateway; @NotNull(groups = {StaticGroup.class,DhcpGroup.class}) @Pattern(regexp = "^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])$", groups = StaticGroup.class) private String dns1; @NotNull(groups = {StaticGroup.class,DhcpGroup.class}) @Pattern(regexp = "^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])$", groups = StaticGroup.class) private String dns2; @NotNull(groups = {StaticGroup.class,DhcpGroup.class}) private Integer isDhcp; }在Controller中指定组来对不同的情况进行校验。
//静态配置网络
@RequestMapping(value = "/set-netconfig-static", method = RequestMethod.POST)
@ResponseBody
public AjaxResult setNetconfigStatic(HttpServletRequest request, @Validated({StaticGroup.class}) NetworkParam networkParam, BindingResult bindingResult) throws IOException {
logger.info("NetconfigController setNetConfigStatic:/set-netconfig-static?params={}", networkParam.toString());
if (bindingResult.hasErrors()) {
return AjaxResult.errorParam();
}
}
//DHCP配置网络 @RequestMapping(value = "/set-netconfig-dhcp", method = RequestMethod.POST) @ResponseBody public AjaxResult setNetconfigDhcp(HttpServletRequest request, @Validated({DhcpGroup.class}) NetworkParam networkParam, BindingResult bindingResult) throws IOException { logger.info("NetconfigController setNetConfigDhcp:/set-netconfig-dhcp?params={}", networkParam.toString()); if (bindingResult.hasErrors()) { return AjaxResult.errorParam(); } }
控制组的校验顺序
@GroupSequence({Group1.class,Group2.class,User.class})来控制校验顺序,即先校验group1再校验group2
参考:
https://www.jianshu.com/p/fc6c20af759a https://www.cnblogs.com/hujihon/p/5357481.html
相关文章推荐
- SpringMVC集成Hibernate Validator进行注解式的参数校验——让代码更少、更加专注于业务逻辑
- 使用SpringMVC时配合福建快三开奖网平台架设hibernate-validate进行参数的合法性校验,能节省一定的代码量.
- SpringMVC + Hibernate-Validator 参数校验
- springmvc使用hibernate-validator校验框架实现后端校验
- SpringMVC和FreeMarker整合Hibernate-validator在页面渲染校验错误信息
- Hibernate Validator参数校验
- Spring4新特性—集成Validation进行参数校验
- SpringMvc (四) 集成 spring/springMvc/hibernateValidator
- SpringMVC整合Hibernate Validator验证方法与js校验
- springMVC校验之hibernate validator校验器的使用
- springmvc 集成和使用 hibernate-validator
- Hibernate Validator 校验方法的参数,返回值,构造函数
- java使用validator进行校验
- 假装看源码之springmvc (一) 如何进行请求参数的解析
- SpringMvc-Hibernate校验
- Hibernate validator限制参数非空方法
- 基于hibernate_validator的异步表单校验框架使用说明
- 使用hibernate进行数据校验那些事
- SpringMVC参数校验(针对`@RequestBody`返回`400`)
- Hibernate-validator校验框架使用