全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解SpringMVC验证框架Validation特殊用法

基本用法不说了,网上例子很多,这里主要介绍下比较特殊情况下使用的方法。

1. 分组

有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下使用不同验证方式,比如说对于一个实体类来的id来说,保存的时候是不需要的,对于更新时是必须的,可以如下配置:

public class UserModel { 
 
  @NotNull(message = "{id.empty}", groups = { First.class }) 
  private int id; 
 
  @NotNull(message = "{username.empty}", groups = { First.class, Second.class }) 
  private String username; 
 
  @NotNull(message = "{content.empty}", groups = { First.class, Second.class }) 
  private String content; 
 
  public int getId() { 
    return id; 
  } 
 
  public void setId(int id) { 
    this.id = id; 
  } 
 
  public String getUsername() { 
    return username; 
  } 
 
  public void setUsername(String username) { 
    this.username = username; 
  } 
 
  public String getContent() { 
    return content; 
  } 
 
  public void setContent(String content) { 
    this.content = content; 
  } 
} 
public interface First { 
} 
 
public interface Second { 
} 

通过 groups 对验证进行分组

在controler中的代码如下:

@RequestMapping(value = "/save.action", method = RequestMethod.POST) 
public String save(@Validated( { Second.class }) UserModel userModel, BindingResult result) { 
  if (result.hasErrors()) { 
    return "validate/error"; 
  } 
  return "redirect:/success"; 
} 
 
@RequestMapping(value = "/update.action", method = RequestMethod.POST) 
public String update(@Validated( { First.class, Second.class }) UserModel user, BindingResult result) { 
  if (result.hasErrors()) { 
    return "validate/error"; 
  } 
  return "redirect:/success"; 
} 

2. 组序列

默认情况下,不同组别的约束验证是无序的,然而在某些情况下,约束验证的顺序却很重要,如下面两个例子:(1)第二个组中的约束验证依赖于一个稳定状态来运行,而这个稳定状态是由第一个组来进行验证的。(2)某个组的验证比较耗时,CPU 和内存的使用率相对比较大,最优的选择是将其放在最后进行验证。因此,在进行组验证的时候尚需提供一种有序的验证方式,这就提出了组序列的概念。

一个组可以定义为其他组的序列,使用它进行验证的时候必须符合该序列规定的顺序。在使用组序列验证的时候,如果序列前边的组验证失败,则后面的组将不再给予验证。

下例中声明了组 GroupA.class,GroupB.class 和 Group.class,其中 default,GroupA,GroupB 均为 Group 的序列。

public interface GroupA { 
} 
 
public interface GroupB { 
} 
 
@GroupSequence( { Default.class, GroupA.class, GroupB.class }) 
public interface Group { 
} 
 
public class User { 
  @NotEmpty(message = "firstname may be empty") 
  private String firstname; 
 
  @NotEmpty(message = "middlename may be empty", groups = Default.class) 
  private String middlename; 
 
  @NotEmpty(message = "lastname may be empty", groups = GroupA.class) 
  private String lastname; 
 
  @NotEmpty(message = "country may be empty", groups = GroupB.class) 
  private String country; 
} 
[java] view plain copy 在CODE上查看代码片派生到我的代码片
@RequestMapping(value = "/update.action", method = RequestMethod.POST) 
public String register(@Validated(Group.class) User user, BindingResult result) { 
  if (result.hasErrors()) { 
    return "validate/error"; 
  } 
  return "redirect:/success"; 
} 

3. 验证多个对象

当我们在一个功能处理方法上需要验证多个模型对象时,需要通过如下形式来获取验证结果:

@RequestMapping("/validate/multi") 
public String multi(@Valid @ModelAttribute("a") A a, BindingResult aErrors, @Valid @ModelAttribute("b") B b, BindingResult bErrors) { 
 
  if (aErrors.hasErrors()) { //如果a模型对象验证失败 
    return "validate/error"; 
  } 
  if (bErrors.hasErrors()) { //如果a模型对象验证失败 
    return "validate/error"; 
  } 
  return "redirect:/success"; 
} 

每一个模型对象后边都需要跟一个Errors或BindingResult对象来保存验证结果,其方法体内部可以使用这两个验证结果对象来选择出错时跳转的页面或处理的逻辑。

4. Junit测试

当自定义拓展Validation时,可以使用如下方法进行测试:

@Test 
public void testValidate() { 
  AnnotationDescriptor<EqualsAny> descriptor = new AnnotationDescriptor<EqualsAny>(EqualsAny.class); 
  EqualsAny equalsAny = AnnotationFactory.create(descriptor); 
  EqualsAnyValidator equalsAnyValidator = new EqualsAnyValidator(); 
  equalsAnyValidator.initialize(equalsAny); 
  Assert.assertTrue(equalsAnyValidator.isValid("123", null)); 
} 

另外再讲一点spring对自定义JSR-303限制类型支持的新特性,那就是Spring支持往ConstraintValidator里面注入bean对象。例如在EqualsAnyValidator中利用@Resource注解注入其他Bean对象。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# springmvc  # validation  # springmvc验证框架  # spring  # Spring自带的校验框架Validation的使用实例  # springboot使用校验框架validation校验的示例  # Spring 使用Validation 验证框架的问题详解  # 情况下  # 多个  # 自定义  # 可以使用  # 放在  # 第一个  # 不需要  # 是由  # 均为  # 将其  # 提出了  # 这就  # 这两个  # 有多  # 第二个  # 实体类  # 当我们  # 跳转  # 比较大  # 却很 


相关文章: 制作旅游网站html,怎样注册旅游网站?  建站主机与服务器功能差异如何区分?  c# 服务器GC和工作站GC的区别和设置  建站10G流量真的够用吗?如何应对访问高峰?  如何获取上海专业网站定制建站电话?  广州商城建站系统开发成本与周期如何控制?  建站VPS配置与SEO优化指南:关键词排名提升策略  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  ,如何利用word制作宣传手册?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  宁波自助建站系统如何快速打造专业企业网站?  建站主机服务器选购指南:轻量应用与VPS配置解析  如何在宝塔面板创建新站点?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  如何在企业微信快速生成手机电脑官网?  javascript中的try catch异常捕获机制用法分析  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  建站之星后台密码如何安全设置与找回?  如何选择PHP开源工具快速搭建网站?  网站制作的步骤包括,正确网址格式怎么写?  C++时间戳转换成日期时间的步骤和示例代码  北京网站制作的公司有哪些,北京白云观官方网站?  手机网站制作与建设方案,手机网站如何建设?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  导航网站建站方案与优化指南:一站式高效搭建技巧解析  建站之星如何配置系统实现高效建站?  如何快速搭建高效可靠的建站解决方案?  如何在IIS7中新建站点?详细步骤解析  如何在橙子建站上传落地页?操作指南详解  平台云上自主建站:模板化设计与智能工具打造高效网站  临沂网站制作公司有哪些,临沂第四中学官网?  IOS倒计时设置UIButton标题title的抖动问题  如何续费美橙建站之星域名及服务?  如何在IIS服务器上快速部署高效网站?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何做网站制作流程,*游戏网站怎么搭建?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  七夕网站制作视频,七夕大促活动怎么报名?  学校为何禁止电信移动建设网站?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  如何用景安虚拟主机手机版绑定域名建站?  实例解析Array和String方法  Python如何创建带属性的XML节点  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  宝塔面板创建网站无法访问?如何快速排查修复?  北京的网站制作公司有哪些,哪个视频网站最好?  建站之星后台密码遗忘或太弱?如何重置与强化?  家具网站制作软件,家具厂怎么跑业务?  如何用腾讯建站主机快速创建免费网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。