使用oVal进行Java Bean 验证的注意事项

Posted koal的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用oVal进行Java Bean 验证的注意事项相关的知识,希望对你有一定的参考价值。

如果需要不同条件验证不同的属性的时候,需要使用profiles属性,每个校验注解符中都有。注意:oVal默认是启用所有的profiles,所以在对单独一个profile进行启用的时候,需要先disableAllProfiles

当使用除了@NotNull之外的校验符时,需使用@NotNull先校验,否则其他校验符不起作用。譬如当使用@ValidateWithMethod校验符的时候,需要先使用@NotNull进行校验

全部Bean properties代码如下:

@Data
public class NewHouseInputParam {

    @NotNull(errorCode = "-10001", message = "orderId不能为空")
    private Long orderId;// 订单Id
    @NotNull(errorCode = "-1", message = "INPUT订单状态不能为空")
    private Integer status; //(1,"录入报备",""),(2,"录入到访",""),(3,"录入无效",""),(4,"录入下定",""),(5,"录入成交",""),(6,"录入开票",""),(7,"录入结佣",""),

    //报备录入
    @NotNull(profiles = {"profile_1"},errorCode = "-1", message = "报备日期不能为空")
    @ValidateWithMethod(profiles = {"profile_1"},methodName = "isValidDate",parameterType = String.class,
            errorCode = "-1", message = "报备日期不合法")
    private String applyDate;// 报备日期

    //到访录入
    @NotNull(profiles = {"profile_2"},errorCode = "-1", message = "到访日期不能为空")
    @ValidateWithMethod(profiles = {"profile_2"},methodName = "isValidDate",parameterType = String.class,
            errorCode = "-1", message = "到访日期不合法")
    private String visitDate;// 到访日期
    @NotNull(profiles = {"profile_2"},errorCode = "-1", message = "到访确认单照片不能为空")
    private String visitImgKey;// 到访确认单照片

    //下定录入
    @NotNull(profiles = {"profile_4"},errorCode = "-1", message = "下定合同照片不能为空")
    private String bookImgKey;// 下定合同照片
    @NotNull(profiles = {"profile_4"},errorCode = "-1", message = "产品id不能为空")
    private Long bookProductId;// 产品id
    @NotNull(profiles = {"profile_4"},errorCode = "-1", message = "下定合同编号不能为空")
    @MaxLength(value = 20,profiles = {"profile_4"},errorCode = "-1", message = "下定合同编号不合法")
    private String bookContractCode;// 下定合同编号

    @NotNull(profiles = "profile_4",errorCode = "-1", message = "下定金额不能为空")
    @ValidateWithMethod(profiles = {"profile_4"},methodName = "isValid6Money",parameterType = String.class,
            errorCode = "-1", message = "下定金额不合法")
    private String bookPrice;// 下定金额
    @NotNull(profiles = "profile_4",errorCode = "-1", message = "购房总价不能为空")
    @ValidateWithMethod(profiles = {"profile_4"},methodName = "isValid9Money",parameterType = String.class,
            errorCode = "-1", message = "购房总价不合法")
    private String bookTotalPrice;// 购房总价
    @NotNull(profiles = "profile_4",errorCode = "-1", message = "预计佣金不能为空")
    @ValidateWithMethod(profiles = {"profile_4"},methodName = "isValid9Money",parameterType = String.class,
            errorCode = "-1", message = "预计佣金不合法")
    private String bookPossibleCommission;// 预计佣金
    @NotNull(profiles = "profile_4",errorCode = "-1", message = "下定日期不能为空")
    @ValidateWithMethod(profiles = {"profile_4"},methodName = "isValidDate",parameterType = String.class,
            errorCode = "-1", message = "下定日期不合法")
    private String bookDate;// 下定日期

    //成交录入
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "合同照片不能为空")
    @MinLength(profiles = "profile_5",value = 1,errorCode = "-1",message = "合同照片不能为空")
    private String dealImgKey;// 合同照片
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "合同总价不能为空")
    @ValidateWithMethod(profiles = {"profile_5"},methodName = "isValid6Money",parameterType = String.class,
            errorCode = "-1", message = "合同总价不合法")
    private String dealContractPrice;// 合同总价
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "产品Id不能为空")
    private Long dealProductId;// 产品Id
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "合同编号不能为空")
    @MinLength(profiles = "profile_5",value = 1,errorCode = "-1",message = "合同编号不能为空")
    private String dealContractCode;// 合同编号
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "应收佣金不能为空")
    @ValidateWithMethod(profiles = {"profile_5"},methodName = "isValid6Money",parameterType = String.class,
            errorCode = "-1", message = "应收佣金不合法")
    private String dealReceivableCommission;// 应收佣金
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "成交日期不能为空")
    @ValidateWithMethod(profiles = {"profile_5"},methodName = "isValidDate",parameterType = String.class,
            errorCode = "-1", message = "成交日期不合法")
    private String dealDate;// 成交日期
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "室不能为空")
    @Range(profiles = {"profile_5"},min = 0,max = 9,errorCode = "-1", message = "室不合法")
    private Integer bedroomSum;//
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "厅不能为空")
    @Range(profiles = {"profile_5"},min = 0,max = 9,errorCode = "-1", message = "厅不合法")
    private Integer livingRoomSum;//
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "卫不能为空")
    @Range(profiles = {"profile_5"},min = 0,max = 9,errorCode = "-1", message = "卫不合法")
    private Integer wcSum;//
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "面积不能为空")
    @ValidateWithMethod(profiles = {"profile_5"},methodName = "isValid4Money",parameterType = String.class,
            errorCode = "-1", message = "面积不合法")
    private String spaceArea;// 面积
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "室号不能为空")
    @MaxLength(profiles = {"profile_5"},value = 10,errorCode = "-1", message = "室号非法")
    private String room;// 室号
    @NotNull(profiles = {"profile_5"},errorCode = "-1", message = "楼栋号不能为空")
    @MaxLength(profiles = {"profile_5"},value = 10,errorCode = "-1", message = "楼栋号非法")
    private String building;// 楼栋号

    //开票录入
    @NotNull(profiles = {"profile_6"},errorCode = "-1", message = "开票金额不能为空")
    @ValidateWithMethod(profiles = {"profile_6"},methodName = "isValid6Money",parameterType = String.class,
            errorCode = "-1", message = "开票金额不合法")
    private String invoicePrice;// 开票金额
    @NotNull(profiles = {"profile_6"},errorCode = "-1", message = "开票日期不能为空")
    @ValidateWithMethod(profiles = {"profile_6"},methodName = "isValidDate",parameterType = String.class,
            errorCode = "-1", message = "开票日期不合法")
    private String invoiceDate;// 开票日期

    //结佣录入
    @NotNull(profiles = {"profile_7"},errorCode = "-1", message = "结佣金额不能为空")
    @ValidateWithMethod(profiles = {"profile_7"},methodName = "isValid6Money",parameterType = String.class,
            errorCode = "-1", message = "结佣金额不合法")
    private String commissionPrice;// 结佣金额
    @NotNull(profiles = {"profile_7"},errorCode = "-1", message = "结佣日期不能为空")
    @ValidateWithMethod(profiles = {"profile_7"},methodName = "isValidDate",parameterType = String.class,
            errorCode = "-1", message = "结佣日期不合法")
    private String commissionDate;// 结佣日期

    //失效录入
    @NotNull(profiles = {"profile_3"},errorCode = "-1", message = "失效原因不能为空")
    @MaxLength(profiles = {"profile_3"},value = 100,errorCode = "-1", message = "失效原因不合法")
    private String invalidDesc;// 失效原因

    @Override
    public String toString() {
        return "NewHouseInputParam{" +
                "orderId=" + orderId +
                ", status=" + status +
                ", applyDate=‘" + applyDate + ‘\‘‘ +
                ", visitDate=‘" + visitDate + ‘\‘‘ +
                ", visitImgKey=‘" + visitImgKey + ‘\‘‘ +
                ", bookImgKey=‘" + bookImgKey + ‘\‘‘ +
                ", bookProductId=" + bookProductId +
                ", bookContractCode=‘" + bookContractCode + ‘\‘‘ +
                ", bookPrice=" + bookPrice +
                ", bookTotalPrice=" + bookTotalPrice +
                ", bookPossibleCommission=" + bookPossibleCommission +
                ", bookDate=‘" + bookDate + ‘\‘‘ +
                ", dealImgKey=‘" + dealImgKey + ‘\‘‘ +
                ", dealContractPrice=" + dealContractPrice +
                ", dealProductId=" + dealProductId +
                ", dealContractCode=" + dealContractCode +
                ", dealReceivableCommission=" + dealReceivableCommission +
                ", dealDate=‘" + dealDate + ‘\‘‘ +
                ", bedroomSum=" + bedroomSum +
                ", livingRoomSum=" + livingRoomSum +
                ", wcSum=" + wcSum +
                ", spaceArea=‘" + spaceArea + ‘\‘‘ +
                ", room=‘" + room + ‘\‘‘ +
                ", building=‘" + building + ‘\‘‘ +
                ", invoicePrice=‘" + invoicePrice + ‘\‘‘ +
                ", invoiceDate=‘" + invoiceDate + ‘\‘‘ +
                ", commissionPrice=‘" + commissionPrice + ‘\‘‘ +
                ", commissionDate=‘" + commissionDate + ‘\‘‘ +
                ", invalidDesc=‘" + invalidDesc + ‘\‘‘ +
                ‘}‘;
    }

    /**
     * 验证日期格式是否合法
     * @param date
     * @return
     */
    public boolean isValidDate(String date){
        Date d = DateUtil.stringToDate(date, "YYYY-MM-dd");
        return d != null;
    }

    /**
     * 验证范围{0.00-9999.99}
     * @param money
     * @return
     */
    private boolean isValid4Money(String money){
        money = numericalMax2Points(money);
        if(money != null){
            float f = Float.parseFloat(money);
            if(f >= 0 && f < 10000){
                return true;
            }
        }
        return false;
    }

    /**
     * 验证范围{0.00-999999.99}
     * @param money
     * @return
     */
    private boolean isValid6Money(String money){
        money = numericalMax2Points(money);
        if(money != null){
            float f = Float.parseFloat(money);
            if(f >= 0 && f < 1000000){
                return true;
            }
        }
        return false;
    }

    /**
     * 验证范围{0.00-999,999,999.99}
     * @param money
     * @return
     */
    private boolean isValid9Money(String money){
        money = numericalMax2Points(money);
        if(money != null){
            float f = Float.parseFloat(money);
            if(f >= 0 && f < 1000000000){
                return true;
            }
        }
        return false;
    }

    /**
     * 判断在去除","后是否是数字,并且最多两位小数
     * 正确则返回处理后的money
     * 否则返回null
     * @param money
     * @return
     */
    private String numericalMax2Points(String money){
        try {
            if (money != null) {
                if (money.indexOf(",") > 0 || money.indexOf(",") > 0) {
                    money = StringUtil.remove(money, ‘,‘);
                    money = StringUtil.remove(money, ‘,‘);
                }
                if (money.matches("-?[0-9]+.?([0-9]{0,2})")) {
                    return money;
                }
            }
        }catch (Exception e){}
        return null;
    }
}

 

    使用oVal代码,自己封装的Response:
//验证参数是否正确
        WeixinEntValidatorUtil util = WeixinEntValidatorUtil.getInstance();
        util.disableAllProfiles();
        util.enableProfile("profile_" + param.getStatus());
        res = util.validate(param);
        if(res.getStatus() != null && res.getStatus() != 0){
            return res;
        }

WeixinEntValidatorUtil代码如下:

public class WeixinEntValidatorUtil extends ValidatorUtil<Response> {
    private static final WeixinEntValidatorUtil WEIXIN_ENT_VALIDATOR_UTILS = new WeixinEntValidatorUtil();

    public static WeixinEntValidatorUtil getInstance(){return WEIXIN_ENT_VALIDATOR_UTILS;}

    /**
     * 失败
     * @param errorCode
     * @param message
     * @return
     */
    @Override
    protected Response transferResponse(String errorCode, String message) {
        Integer errorCodeInt;
        try {
            errorCodeInt = Integer.parseInt(errorCode);
        }catch (Exception e) {
            errorCodeInt = -1;
        }
        return new Response(errorCodeInt,message);
    }

    /**
     * 成功
     * @param o
     * @return
     */
    @Override
    protected Response succResponse(Object o) {
        return new Response(0,"");
    }

    public Response validate(Object o){return getInstance()._validate(o);}

    @Override
    protected Response _validate(Object o) {
        return super._validate(o);
    }
}

父类代码:

public abstract class ValidatorUtil<T> {

    private static final Validator validator = new Validator();

    protected abstract T transferResponse(String errorCode,String message);

    protected abstract T succResponse(Object o);

    /**
     * if the object is null then the util by oval will throw exception
     * @param o
     * @return
     */
    protected T _validate (Object o) {
        List<ConstraintViolation> violations = validator.validate(o);
        if (violations.size() > 0) {
            //System.out.println(violations);
            return transferResponse(violations.get(0).getErrorCode(),violations.get(0).getMessage());
        }
        return succResponse(o);
    }

    public void disableProfile(String profileName){
        validator.disableProfile(profileName);
    }

    public void disableAllProfiles(){
        validator.disableAllProfiles();
    }

    public void enableProfile(String profileName){
        validator.enableProfile(profileName);
    }

    public void enableAllProfiles(){
        validator.enableAllProfiles();
    }


}

 

以上是关于使用oVal进行Java Bean 验证的注意事项的主要内容,如果未能解决你的问题,请参考以下文章

在 JSF 中使用 bean 验证进行本地化

Bean Validation 技术规范特性概述

protobuf 生成的 Java 对象上的级联 bean 验证不起作用

使用 Hibernate 实现在 OSGI 上下文中使用 CXF 进行 Bean 验证

Java bean中布尔类型使用注意

如何在 Spring Boot 应用程序中使用 Hibernate 验证进行 Bean 验证?