• 通过groovy表达式拓展oval——实现根据同一实体中的其他属性值对某个字段进行校验


    在java的参数校验中,开源验证框架OVAL基本能够满足所有需求,如下面通过简单的添加注解,就可实现对参数的非空和长度校验。

      @NotNull(message="计息周期月数不能为空")
      @NotBlank(message="计息周期月数不能为空字符")
      @Length(max=5, message="计息周期月数长度最大不能超过5")
      private String iccmc;

    当涉及到较复杂的校验时,oval也能支持,如:要根据同一实体中的其他属性的值来实现对某个属性的校验,可以通过在注解中编写groovy表达式来实现校验逻辑。

    步骤:

    1. 引入groovy相关依赖

    <dependency>
           <groupId>org.codehaus.groovy</groupId>
           <artifactId>groovy-all</artifactId>
           <version>${groovy.version}</version>
    </dependency>

    2. 实体类

    import java.io.Serializable;
    import net.sf.oval.constraint.Length;
    import net.sf.oval.constraint.NotBlank;
    import net.sf.oval.constraint.NotNull;
    
    public class DemoDto implements Serializable
    { 
      @NotNull(message="计息周期月数不能为空")
      @NotBlank(message="计息周期月数不能为空字符")
      @Length(max=5, message="计息周期月数长度最大不能超过5")
      private String iccmc;
      
      @NotNull(message="业务品种不能为空")
      @Length(max=32, message="业务品种长度最大不能超过32")
      private DemoBusinessTypeEnum businessType;
      
      //如果是学业贷款,利率增长方式可以为空,否则,该字段必填
      @NotNull(when="groovy:_this.businessType!=null && _this.businessType.getCode() != '1019' ", message="利率增长方式不能为空")
      @Length(max=18, message="利率增长方式长度最大不能超过18")
      private DemoRateIncreaseEnum rateIncreaseType;
    
      /*   *getter & setter   */

    DemoBusinessTypeEnum.java
    public enum DemoBusinessTypeEnum
    {
      SHORT_1005005001("1005005001", "农业贷款"),  
      SHORT_1005005005("1005005005", "旅游业贷款"),  
      SHORT_1005005010("1005005010", "制造业贷款"),  
      TICKET_1019("1019", "学业贷款");
      
      private String code;
      private String desc;
      
      private DemoBusinessTypeEnum(String code, String desc)
      {
        this.code = code;
        this.desc = desc;
      }
      
      public static DemoBusinessTypeEnum findBycode(String code)
      {
        DemoBusinessTypeEnum[] arry = values();
        int len = arry.length;
        for (int i = 0; i < len; i++)
        {
          DemoBusinessTypeEnum frs = arry[i];
          if (frs.getCode().equals(code)) {
            return frs;
          }
        }
        return null;
      }
      
      public String getCode()
      {
        return this.code;
      }
      public String getDesc()
      {
        return this.desc;
      }
    }
  • 相关阅读:
    nginx中目录转义字符问题
    2022年3月2日最近的状态~
    [esp8266]官方SDK与arduino ROM或Flash布局,Vscode+platformio 如何设置
    什么是并发容器
    Executor, ExecutorService 和 Executors区别与联系
    Spirng和SpringBoot中的Aop优先使用的是JDK动态代理还是Cglib
    建造者模式
    MySQL四大排名函数
    SpringMVC执行流程解析(PS:使用了适配器模式)
    适配器模式
  • 原文地址:https://www.cnblogs.com/zjfjava/p/10577183.html
Copyright © 2020-2023  润新知