使用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 ...
随机推荐
- (treap)[bzoj3224][洛谷3369][cogs1829]Tyvj 1728 普通平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- Windows Powershell统计代码行数
dir .\ -Recurse *.py | Get-Content | Measure-Object
- Windows网络通信(一):socket同步编程
网络通信常用API 1. WSAStartup用于初始化WinSock环境 int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); ...
- 用Python深入理解跳跃表原理及实现
最近看 Redis 的实现原理,其中讲到 Redis 中的有序数据结构是通过跳跃表来进行实现的.第一次听说跳跃表的概念,感到比较新奇,所以查了不少资料.其中,网上有部分文章是按照如下方式描述跳跃表的: ...
- java之接口开发-初级篇-socket通信
socket通信实现util包类实现 public class SocketThread extends Thread { public void run() { while (true) { // ...
- 深度学习论文笔记:Deep Residual Networks with Dynamically Weighted Wavelet Coefficients for Fault Diagnosis of Planetary Gearboxes
这篇文章将深度学习算法应用于机械故障诊断,采用了“小波包分解+深度残差网络(ResNet)”的思路,将机械振动信号按照故障类型进行分类. 文章的核心创新点:复杂旋转机械系统的振动信号包含着很多不同频率 ...
- ASP.NET 异步Web API + jQuery Ajax 文件上传代码小析
该示例中实际上应用了 jquery ajax(web client) + async web api 双异步. jquery ajax post $.ajax({ type: "POST&q ...
- PowerShell自定义修改远程桌面RDP端口
应朋友的要求写了一个通过PowerShell修改远程桌面(Remote Desktop)端口的脚本,不复杂,启动脚本后有两个选项:1.自定义远程桌面:2.回复远程桌面的默认端口3389 发出来给有用的 ...
- openresty 安装指南
对于一些常见的 Linux 发行版本,OpenResty 提供 官方预编译包.确保你首先用这种方式来安装. 如果您还没有下载 OpenResty 的源码包, 请到 Download 页下载. 首先,您 ...
- c# 捕获一般获取不到的异常
1.主函数入口加异常事件,代码例如: /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void M ...