使用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 验证的注意事项的更多相关文章
- java ee7 -- Java Bean验证
针对对象.对象成员.方法.构造函数的数据验证. 1. 一个验证的小例子 (1) 添加引用jar <dependency> <groupId>org.hibernate.vali ...
- Java参数验证Bean Validation 框架
1.为什么要做参数校验? 参数校验和业务逻辑代码分离,参数校验代码复用,统一参数校验方式.校验不太通过时统一异常描述. 2.bean validation规范 JSR303 规范(Bean Valid ...
- java bean 属性验证框架 valid
项目介绍 java 开发中,参数校验是非常常见的需求. 但是 hibernate-validator 在使用过程中,依然会存在一些问题. 特性 支持 fluent-validation 支持 jsr- ...
- 深入了解数据校验:Java Bean Validation 2.0(JSR380)
每篇一句 吾皇一日不退役,尔等都是臣子 相关阅读 [小家Java]深入了解数据校验(Bean Validation):基础类打点(ValidationProvider.ConstraintDescri ...
- 用大白话聊聊JavaSE -- 如何理解Java Bean(一)
首先,在开始本章之前,先说一个总的概念:所谓的Java Bean,就是一个java类,编译后成为了一个后缀名是 .class的文件.这就是Java Bean,很多初学者,包括当年的我自己,总是被这些专 ...
- Java Bean、POJO、 Entity、 VO 、PO、DAO
Java Bean.POJO. Entity. VO , 其实都是java 对象,只不过用于不同场合罢了. Java Bean: 就是一个普通的Java 对象, 只不过是加了一些约束条件. 声 ...
- [Java] JSP笔记 - Java Bean
一. Java Bean 是什么? Java Bean 其实就是一个符合特定规则的 Java Class.这些规则包括: 使用 public 声明的公用类 属性使用public 的get,set方法访 ...
- Java Bean
Java 帝国之Java bean (上) Java 帝国之Java bean(下) Difference between DTO, VO, POJO, JavaBeans? Java bean 是个 ...
- Java bean validation 规范与参考实现
1.Apache Bval 依赖包:validation-api-1.1.0.Final.jar org.apache.bval.bundle-1.1.1.jar bval-core-1.1.1.ja ...
随机推荐
- day2 Ubuntu配置源
1.寻找国内镜像源 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 2.配置source list源 sources.list系统自带的,源是来U ...
- 洛谷 P1941 飞扬的小鸟
洛谷 P1941 飞扬的小鸟 原题链接 首先吐槽几句 noip都快到了,我还不刷起联赛大水题! 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节 ...
- L013-linux基础正则表达式手把手实战讲解小节
L013-linux基础正则表达式手把手实战讲解小节 这么一看又有10天没更新博客了,最近也一直在学就是时间比较闲散,再加上做上次老师留的十多道题,所以时间比较紧张,本来做完题准备直接先看L014讲解 ...
- kettle 将job等导入导出成xml
一.导出 工具->资源库->探索资源库 就可以看见资源库里面的资源了. 如果要导出资源库里面的某个目录就右键就行了. 如果要导出全部资源库的文件就如下图所示 将资源库导出其实也是一个xml ...
- Web自动化常用方法封装(不定时更新)
/** * JScript实现鼠标悬停 */public void mouseHoverJScript(By by,WebElement HoverElement) { // TODO Auto-ge ...
- 基于Mininet测量路径的损耗率
基于Mininet测量路径的损耗率 控制器采用POX,基于OVS仿真 Mininet脚本 创建Node mininet.node Node 创建链路连接 mininet.link TCLink 设置i ...
- 使用 Mesos 管理虚拟机
摘要 为了满足渲染.基因测序等计算密集型服务的需求,UCloud 推出了“计算工厂”产品,让用户可以快速创建大量的计算资源(虚拟机).该产品的背后,是一套基于 Mesos 的计算资源管理系统.本文简要 ...
- 创建image
摘要: 本节演示如何通过 Web GUI 和 CLI 两种方法创建 Image. 本节演示如何通过 Web GUI 和 CLI 两种方法创建 Image. OpenStack 为终端用户提供了 Web ...
- MySQL Proxy和 Amoeba 工作机制浅析
MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断.改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate 之类的网络代理服务器的基本思想是一样的.代理服务器是和 ...
- Scrum立会报告+燃尽图(十月十二日总第三次):视频相关工作
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2190 Scrum立会master:孙赛佳 一.小组介绍 组长:付佳 组员 ...