- 浏览: 15112 次
- 性别:
- 来自: 深圳
-
最新评论
参数检查用得最多的是JSR 303,用法示例:
http://blog.csdn.net/caihaijiang/article/details/7463514
但JSR 303有个缺点,那就是当参数的限制发生变化时,例如某String类型的最大长度由10改为20,就需要改代码重新编译。
那有没有办法只改配置文件重启程序就达到目的呢?
网上还没有类似的解决方案,那就自己实现Java Validation。
思路:
参数检查时,从配置文件中取得参数的限制条件,通过反射取得对应的字段值,并进行验证。
用法:
Java代码 收藏代码
//利用反射和注解自行实现的参数检查
Order order = newOrder();
Map<String, String> configMap = ConfigMap.INSTANCE.getMap();
//需要两个参数:一是需要参数检查的对象,二是参数的限制条件
List<String> list = Checker.INSTANCE.check(order, configMap);
for (String str : list) {
/*输出示例:
cardNo不符合正则表达式\d+
name长度最小不能小于2
address长度最小不能小于2
intVal最大不能超过9
integerVal最小不能小于4
longVal最小不能小于4
longGVal最小不能小于4
*/
System.out.println(str);
}
}
Java代码 收藏代码
package com.ljn.validation;
import java.util.HashMap;
import java.util.Map;
/**
*
* 模拟从配置文件中读取配置值
* 用点号分隔,最后是字段名
*/
public enum ConfigMap {
INSTANCE;
private Map<String, String> map;
ConfigMap() {
map = new HashMap<String, String>();
//在配置文件中这样写:check.com.ljn.validation.MyOrder.userId.max=3
//表示MyOrder这个类的userId字段,长度最大为3
map.put("check.com.ljn.validation.MyOrder.userId.max", "3");
map.put("check.com.ljn.validation.MyOrder.name.max", "3");
map.put("check.com.ljn.validation.MyOrder.address.max", "3");
map.put("check.com.ljn.validation.MyOrder.cardNo.reg", "\\d+");
map.put("check.com.ljn.validation.MyOrder.intVal.max", "9");
map.put("check.com.ljn.validation.MyOrder.integerVal.max", "9");
map.put("check.com.ljn.validation.MyOrder.longVal.max", "9");
map.put("check.com.ljn.validation.MyOrder.longGVal.max", "9");
map.put("check.com.ljn.validation.MyOrder.userId.min", "2");
map.put("check.com.ljn.validation.MyOrder.name.min", "2");
map.put("check.com.ljn.validation.MyOrder.address.min", "2");
map.put("check.com.ljn.validation.MyOrder.intVal.min", "4");
map.put("check.com.ljn.validation.MyOrder.integerVal.min", "4");
map.put("check.com.ljn.validation.MyOrder.longVal.min", "4");
map.put("check.com.ljn.validation.MyOrder.longGVal.min", "4");
map.put("check.com.ljn.validation.MyOrder.bigDecimalVal.maxBigDecimalIntegerSize", "5");
map.put("check.com.ljn.validation.MyOrder.bigDecimalVal.maxBigDecimalFractionSize", "2");
}
}
Java代码 收藏代码
package com.ljn.validation;
import java.math.BigDecimal;
import java.util.List;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class Order {
@Check(NotNull=true)
@NotNull
private List nullVal;
@Size(min =2, max = 3)
@Check(Min=true,Max=true)
private String name;
@Size(min =2, max = 3)
@Check(Min=true, Max=true)
private String address;
private String userId;
@Min(4)
@Max(9)
@Check(Min=true, Max=true)
private int intVal;
@Min(4)
@Max(9)
@Check(Min=true, Max=true)
private Integer integerVal;
@Min(4)
@Max(9)
@Check(Min=true, Max=true)
private long longVal;
@Min(4)
@Max(9)
@Check(Min=true, Max=true)
private Long longGVal;
@Digits(integer=5, fraction=2)
@Check(MaxBigDecimalFractionSize=true, MaxBigDecimalIntegerSize=true)
private BigDecimal bigDecimalVal;
//...setter and getter
}
测试表明,Checker比JSR 303速度更快。Checker没有JSR 303那么全面,但也基本够用。
源码:
Java代码 收藏代码
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 1.NotNull/NotBlank默认值为false,其他为true
* 2.即使Min/Max/MaxBigDecimalIntegerSize/MaxBigDecimalFractionSize/RegExp这些选项配置为true,
* 也需要在配置文件中配置了具体值才会进行检查
* 3.对于String类型,不要同时配置NotNull和NotBlank,建议只配置NotBlank
* @author ljn
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Check {
/**
* 检查是否为null,适用所有数据类型
*/
public boolean NotNull() default false;
/**
* 检查字符串是否为空字符串(包括null),相当于StringUtils.isBlank
*/
public boolean NotBlank() default false;
/**
* 对于String类型,检查字符串长度是否小于最小长度
* 对于short/Short/int/Integer/long/Long类型,检查是否小于最小值
*/
public boolean Min() default true;
/**
* 对于String类型,检查字符串长度是否超过最大长度
* 对于short/Short/int/Integer/long/Long类型,检查是否超过最大值
*/
public boolean Max() default true;
/**
* 检查BigDecimal类型的整数部分的长度是否超过最大长度
*/
public boolean MaxBigDecimalIntegerSize() default true;
/**
* 检查BigDecimal类型的小数部分的长度是否超过最大长度
*/
public boolean MaxBigDecimalFractionSize() default true;
/**
* 检查字符串类型的值是否符合正则表达式指定的格式
*/
public boolean RegExp() default true;
}
public enum Checker {
INSTANCE;
public static final String KEY_SEPARATOR = ".";
public static final String PREFIX = "check";
public static final String SUFFIX_MAX = "max";
public static final String SUFFIX_MIN = "min";
public static final String SUFFIX_MAX_BIGDECIMAL_INTEGER_SIZE = "maxBigDecimalIntegerSize";
public static final String SUFFIX_MAX_BIGDECIMAL_FRACTION_SIZE = "maxBigDecimalFractionSize";
public static final String SUFFIX_REG_EXP = "regExp";
private Map<Class<?>, List<Field>> classFields = new HashMap<Class<?>, List<Field>>();
/**
*
* @param obj 对obj进行参数检查
* @param configMap 配置值,配置了各字段的限制值,例如最小长度,最大长度
* @return 参数不合法的信息列表
*/
public List<String> check(Object obj, Map<String, String> configMap){
List<String> list = new ArrayList<String>();
if (obj == null || configMap == null || configMap.isEmpty()) {
return list;
}
Class<? extends Object> clazz = obj.getClass();
List<Field> fields = classFields.get(clazz);
if (fields == null) {
fields = getFieldsUpTo(clazz, Object.class);
if (fields == null || fields.isEmpty()) {
return list;
}
classFields.put(clazz, fields);
}
for (Field field : fields) {
field.setAccessible(true);
Check check = field.getAnnotation(Check.class);
if (check == null) {
continue;
}
Class<?> fieldType = field.getType();
String fieldName = field.getName();
Object value = null;
try {
value = field.get(obj);
} catch (Exception e) {
throw new RuntimeException(e);
}
if (value == null) {
if (check.NotNull()) {
list.add(fieldName + "不能为null");
} else if ( check.NotBlank() && fieldType.equals(String.class)) {
list.add(fieldName + "不能为空");
}
} else {
//check_className_fieldName_suffix
String minKey = StringUtils.join(new String[]{PREFIX, clazz.getName(), fieldName, SUFFIX_MIN}, KEY_SEPARATOR);
String maxKey = StringUtils.join(new String[]{PREFIX, clazz.getName(), fieldName, SUFFIX_MAX}, KEY_SEPARATOR);
String maxBigDecimalIntegerSizeKey = StringUtils.join(new String[]{PREFIX, clazz.getName(), fieldName, SUFFIX_MAX_BIGDECIMAL_INTEGER_SIZE}, KEY_SEPARATOR);
String maxBigDecimalFractionSizeKey = StringUtils.join(new String[]{PREFIX, clazz.getName(), fieldName, SUFFIX_MAX_BIGDECIMAL_FRACTION_SIZE}, KEY_SEPARATOR);
String regExpKey = StringUtils.join(new String[]{PREFIX, clazz.getName(), fieldName, SUFFIX_REG_EXP}, KEY_SEPARATOR);
if (fieldType.equals(String.class)) {
String val = (String)value;
if (check.NotBlank() && StringUtils.isBlank(val)) {
list.add(fieldName + "不能为空");
}
if (check.Min()) {
int min = getInt(configMap, minKey);
if (min != -1 && val.length() < min) {
list.add(fieldName + "长度最小不能小于" + min);
}
}
if (check.Max()) {
int max = getInt(configMap, maxKey);
if (max != -1 && val.length() > max) {
list.add(fieldName + "长度最大不能超过" + max);
}
}
if (check.RegExp()) {
String exp = configMap.get(regExpKey);
if (StringUtils.isNotBlank(exp) && StringUtils.isNotBlank(val) && !val.matches(exp)) {
list.add(fieldName + "不符合正则表达式" + exp);
}
}
}
if (fieldType.equals(Integer.class) || fieldType.equals(int.class)) {
Integer val = (Integer)value;
if (check.Min()) {
int min = getInt(configMap, minKey);
if (min != -1 && val < min) {
list.add(fieldName + "最小不能小于" + min);
}
}
if (check.Max()) {
int max = getInt(configMap, maxKey);
if (max != -1 && val > max) {
list.add(fieldName + "最大不能超过" + max);
}
}
}
if (fieldType.equals(Short.class) || fieldType.equals(short.class)) {
Short val = (Short)value;
if (check.Min()) {
int min = getInt(configMap, minKey);
if (min != -1 && val < min) {
list.add(fieldName + "最小不能小于" + min);
}
}
if (check.Max()) {
int max = getInt(configMap, maxKey);
if (max != -1 && val > max) {
list.add(fieldName + "最大不能超过" + max);
}
}
}
if (fieldType.equals(Long.class) || fieldType.equals(long.class)) {
Long val = (Long)value;
if (check.Min()) {
long min = getLong(configMap, minKey);
if (min != -1 && val < min) {
list.add(fieldName + "最小不能小于" + min);
}
}
if (check.Max()) {
long max = getLong(configMap, maxKey);
if (max != -1 && val > max) {
list.add(fieldName + "最大不能超过" + max);
}
}
}
if (fieldType.equals(BigDecimal.class)) {
BigDecimal val = (BigDecimal)value;
String str = val.toPlainString();
String[] parts = str.split("\\.");
if (parts == null || parts.length == 0) {
continue;
}
int integerSize = parts[0].length();
int fractionSize = parts.length == 2 ? parts[1].length() : 0;
if (check.MaxBigDecimalIntegerSize()) {
int max = getInt(configMap, maxBigDecimalIntegerSizeKey);
if (max != -1 && integerSize > max) {
list.add(fieldName + "整数部分长度最大不能超过" + max);
}
}
if (check.MaxBigDecimalFractionSize()) {
int max = getInt(configMap, maxBigDecimalFractionSizeKey);
if (max != -1 && fractionSize > max) {
list.add(fieldName + "小数部分长度最大不能超过" + max);
}
}
}
}
}
return list;
}
/**
* 获取所有的Field
* @param startClass
* @param exclusiveParent
* @return
*/
public List<Field> getFieldsUpTo(Class<?> startClass, Class<?> exclusiveParent) {
List<Field> currentClassFields = new ArrayList<Field>();
Field[] declaredFields = startClass.getDeclaredFields();
for (Field field : declaredFields) {
currentClassFields.add(field);
}
Class<?> parentClass = startClass.getSuperclass();
if (parentClass != null && (exclusiveParent == null || !(parentClass.equals(exclusiveParent)))) {
List<Field> parentClassFields = (List<Field>) getFieldsUpTo(parentClass, exclusiveParent);
currentClassFields.addAll(parentClassFields);
}
return currentClassFields;
}
private static int getInt(Map<String, String> map, String key) {
String val = map.get(key);
if (val != null) {
return Integer.parseInt(val);
}
return -1;
}
private static long getLong(Map<String, String> map, String key) {
String val = map.get(key);
if (val != null) {
return Long.parseLong(val);
}
return -1;
}
}
http://blog.csdn.net/caihaijiang/article/details/7463514
但JSR 303有个缺点,那就是当参数的限制发生变化时,例如某String类型的最大长度由10改为20,就需要改代码重新编译。
那有没有办法只改配置文件重启程序就达到目的呢?
网上还没有类似的解决方案,那就自己实现Java Validation。
思路:
参数检查时,从配置文件中取得参数的限制条件,通过反射取得对应的字段值,并进行验证。
用法:
Java代码 收藏代码
//利用反射和注解自行实现的参数检查
Order order = newOrder();
Map<String, String> configMap = ConfigMap.INSTANCE.getMap();
//需要两个参数:一是需要参数检查的对象,二是参数的限制条件
List<String> list = Checker.INSTANCE.check(order, configMap);
for (String str : list) {
/*输出示例:
cardNo不符合正则表达式\d+
name长度最小不能小于2
address长度最小不能小于2
intVal最大不能超过9
integerVal最小不能小于4
longVal最小不能小于4
longGVal最小不能小于4
*/
System.out.println(str);
}
}
Java代码 收藏代码
package com.ljn.validation;
import java.util.HashMap;
import java.util.Map;
/**
*
* 模拟从配置文件中读取配置值
* 用点号分隔,最后是字段名
*/
public enum ConfigMap {
INSTANCE;
private Map<String, String> map;
ConfigMap() {
map = new HashMap<String, String>();
//在配置文件中这样写:check.com.ljn.validation.MyOrder.userId.max=3
//表示MyOrder这个类的userId字段,长度最大为3
map.put("check.com.ljn.validation.MyOrder.userId.max", "3");
map.put("check.com.ljn.validation.MyOrder.name.max", "3");
map.put("check.com.ljn.validation.MyOrder.address.max", "3");
map.put("check.com.ljn.validation.MyOrder.cardNo.reg", "\\d+");
map.put("check.com.ljn.validation.MyOrder.intVal.max", "9");
map.put("check.com.ljn.validation.MyOrder.integerVal.max", "9");
map.put("check.com.ljn.validation.MyOrder.longVal.max", "9");
map.put("check.com.ljn.validation.MyOrder.longGVal.max", "9");
map.put("check.com.ljn.validation.MyOrder.userId.min", "2");
map.put("check.com.ljn.validation.MyOrder.name.min", "2");
map.put("check.com.ljn.validation.MyOrder.address.min", "2");
map.put("check.com.ljn.validation.MyOrder.intVal.min", "4");
map.put("check.com.ljn.validation.MyOrder.integerVal.min", "4");
map.put("check.com.ljn.validation.MyOrder.longVal.min", "4");
map.put("check.com.ljn.validation.MyOrder.longGVal.min", "4");
map.put("check.com.ljn.validation.MyOrder.bigDecimalVal.maxBigDecimalIntegerSize", "5");
map.put("check.com.ljn.validation.MyOrder.bigDecimalVal.maxBigDecimalFractionSize", "2");
}
}
Java代码 收藏代码
package com.ljn.validation;
import java.math.BigDecimal;
import java.util.List;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class Order {
@Check(NotNull=true)
@NotNull
private List nullVal;
@Size(min =2, max = 3)
@Check(Min=true,Max=true)
private String name;
@Size(min =2, max = 3)
@Check(Min=true, Max=true)
private String address;
private String userId;
@Min(4)
@Max(9)
@Check(Min=true, Max=true)
private int intVal;
@Min(4)
@Max(9)
@Check(Min=true, Max=true)
private Integer integerVal;
@Min(4)
@Max(9)
@Check(Min=true, Max=true)
private long longVal;
@Min(4)
@Max(9)
@Check(Min=true, Max=true)
private Long longGVal;
@Digits(integer=5, fraction=2)
@Check(MaxBigDecimalFractionSize=true, MaxBigDecimalIntegerSize=true)
private BigDecimal bigDecimalVal;
//...setter and getter
}
测试表明,Checker比JSR 303速度更快。Checker没有JSR 303那么全面,但也基本够用。
源码:
Java代码 收藏代码
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 1.NotNull/NotBlank默认值为false,其他为true
* 2.即使Min/Max/MaxBigDecimalIntegerSize/MaxBigDecimalFractionSize/RegExp这些选项配置为true,
* 也需要在配置文件中配置了具体值才会进行检查
* 3.对于String类型,不要同时配置NotNull和NotBlank,建议只配置NotBlank
* @author ljn
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Check {
/**
* 检查是否为null,适用所有数据类型
*/
public boolean NotNull() default false;
/**
* 检查字符串是否为空字符串(包括null),相当于StringUtils.isBlank
*/
public boolean NotBlank() default false;
/**
* 对于String类型,检查字符串长度是否小于最小长度
* 对于short/Short/int/Integer/long/Long类型,检查是否小于最小值
*/
public boolean Min() default true;
/**
* 对于String类型,检查字符串长度是否超过最大长度
* 对于short/Short/int/Integer/long/Long类型,检查是否超过最大值
*/
public boolean Max() default true;
/**
* 检查BigDecimal类型的整数部分的长度是否超过最大长度
*/
public boolean MaxBigDecimalIntegerSize() default true;
/**
* 检查BigDecimal类型的小数部分的长度是否超过最大长度
*/
public boolean MaxBigDecimalFractionSize() default true;
/**
* 检查字符串类型的值是否符合正则表达式指定的格式
*/
public boolean RegExp() default true;
}
public enum Checker {
INSTANCE;
public static final String KEY_SEPARATOR = ".";
public static final String PREFIX = "check";
public static final String SUFFIX_MAX = "max";
public static final String SUFFIX_MIN = "min";
public static final String SUFFIX_MAX_BIGDECIMAL_INTEGER_SIZE = "maxBigDecimalIntegerSize";
public static final String SUFFIX_MAX_BIGDECIMAL_FRACTION_SIZE = "maxBigDecimalFractionSize";
public static final String SUFFIX_REG_EXP = "regExp";
private Map<Class<?>, List<Field>> classFields = new HashMap<Class<?>, List<Field>>();
/**
*
* @param obj 对obj进行参数检查
* @param configMap 配置值,配置了各字段的限制值,例如最小长度,最大长度
* @return 参数不合法的信息列表
*/
public List<String> check(Object obj, Map<String, String> configMap){
List<String> list = new ArrayList<String>();
if (obj == null || configMap == null || configMap.isEmpty()) {
return list;
}
Class<? extends Object> clazz = obj.getClass();
List<Field> fields = classFields.get(clazz);
if (fields == null) {
fields = getFieldsUpTo(clazz, Object.class);
if (fields == null || fields.isEmpty()) {
return list;
}
classFields.put(clazz, fields);
}
for (Field field : fields) {
field.setAccessible(true);
Check check = field.getAnnotation(Check.class);
if (check == null) {
continue;
}
Class<?> fieldType = field.getType();
String fieldName = field.getName();
Object value = null;
try {
value = field.get(obj);
} catch (Exception e) {
throw new RuntimeException(e);
}
if (value == null) {
if (check.NotNull()) {
list.add(fieldName + "不能为null");
} else if ( check.NotBlank() && fieldType.equals(String.class)) {
list.add(fieldName + "不能为空");
}
} else {
//check_className_fieldName_suffix
String minKey = StringUtils.join(new String[]{PREFIX, clazz.getName(), fieldName, SUFFIX_MIN}, KEY_SEPARATOR);
String maxKey = StringUtils.join(new String[]{PREFIX, clazz.getName(), fieldName, SUFFIX_MAX}, KEY_SEPARATOR);
String maxBigDecimalIntegerSizeKey = StringUtils.join(new String[]{PREFIX, clazz.getName(), fieldName, SUFFIX_MAX_BIGDECIMAL_INTEGER_SIZE}, KEY_SEPARATOR);
String maxBigDecimalFractionSizeKey = StringUtils.join(new String[]{PREFIX, clazz.getName(), fieldName, SUFFIX_MAX_BIGDECIMAL_FRACTION_SIZE}, KEY_SEPARATOR);
String regExpKey = StringUtils.join(new String[]{PREFIX, clazz.getName(), fieldName, SUFFIX_REG_EXP}, KEY_SEPARATOR);
if (fieldType.equals(String.class)) {
String val = (String)value;
if (check.NotBlank() && StringUtils.isBlank(val)) {
list.add(fieldName + "不能为空");
}
if (check.Min()) {
int min = getInt(configMap, minKey);
if (min != -1 && val.length() < min) {
list.add(fieldName + "长度最小不能小于" + min);
}
}
if (check.Max()) {
int max = getInt(configMap, maxKey);
if (max != -1 && val.length() > max) {
list.add(fieldName + "长度最大不能超过" + max);
}
}
if (check.RegExp()) {
String exp = configMap.get(regExpKey);
if (StringUtils.isNotBlank(exp) && StringUtils.isNotBlank(val) && !val.matches(exp)) {
list.add(fieldName + "不符合正则表达式" + exp);
}
}
}
if (fieldType.equals(Integer.class) || fieldType.equals(int.class)) {
Integer val = (Integer)value;
if (check.Min()) {
int min = getInt(configMap, minKey);
if (min != -1 && val < min) {
list.add(fieldName + "最小不能小于" + min);
}
}
if (check.Max()) {
int max = getInt(configMap, maxKey);
if (max != -1 && val > max) {
list.add(fieldName + "最大不能超过" + max);
}
}
}
if (fieldType.equals(Short.class) || fieldType.equals(short.class)) {
Short val = (Short)value;
if (check.Min()) {
int min = getInt(configMap, minKey);
if (min != -1 && val < min) {
list.add(fieldName + "最小不能小于" + min);
}
}
if (check.Max()) {
int max = getInt(configMap, maxKey);
if (max != -1 && val > max) {
list.add(fieldName + "最大不能超过" + max);
}
}
}
if (fieldType.equals(Long.class) || fieldType.equals(long.class)) {
Long val = (Long)value;
if (check.Min()) {
long min = getLong(configMap, minKey);
if (min != -1 && val < min) {
list.add(fieldName + "最小不能小于" + min);
}
}
if (check.Max()) {
long max = getLong(configMap, maxKey);
if (max != -1 && val > max) {
list.add(fieldName + "最大不能超过" + max);
}
}
}
if (fieldType.equals(BigDecimal.class)) {
BigDecimal val = (BigDecimal)value;
String str = val.toPlainString();
String[] parts = str.split("\\.");
if (parts == null || parts.length == 0) {
continue;
}
int integerSize = parts[0].length();
int fractionSize = parts.length == 2 ? parts[1].length() : 0;
if (check.MaxBigDecimalIntegerSize()) {
int max = getInt(configMap, maxBigDecimalIntegerSizeKey);
if (max != -1 && integerSize > max) {
list.add(fieldName + "整数部分长度最大不能超过" + max);
}
}
if (check.MaxBigDecimalFractionSize()) {
int max = getInt(configMap, maxBigDecimalFractionSizeKey);
if (max != -1 && fractionSize > max) {
list.add(fieldName + "小数部分长度最大不能超过" + max);
}
}
}
}
}
return list;
}
/**
* 获取所有的Field
* @param startClass
* @param exclusiveParent
* @return
*/
public List<Field> getFieldsUpTo(Class<?> startClass, Class<?> exclusiveParent) {
List<Field> currentClassFields = new ArrayList<Field>();
Field[] declaredFields = startClass.getDeclaredFields();
for (Field field : declaredFields) {
currentClassFields.add(field);
}
Class<?> parentClass = startClass.getSuperclass();
if (parentClass != null && (exclusiveParent == null || !(parentClass.equals(exclusiveParent)))) {
List<Field> parentClassFields = (List<Field>) getFieldsUpTo(parentClass, exclusiveParent);
currentClassFields.addAll(parentClassFields);
}
return currentClassFields;
}
private static int getInt(Map<String, String> map, String key) {
String val = map.get(key);
if (val != null) {
return Integer.parseInt(val);
}
return -1;
}
private static long getLong(Map<String, String> map, String key) {
String val = map.get(key);
if (val != null) {
return Long.parseLong(val);
}
return -1;
}
}
发表评论
-
异步导入
2018-11-11 16:52 981在网上找了很多资料,导入五花八门。由于我参与到导入功能是从架构 ... -
可伸缩性框架搭建
2015-10-28 16:55 518本文面向创业公司的工 ... -
响应结果码 枚举类
2015-10-23 13:59 1643package com.gxhl.ism.common.uti ... -
配置Log4j(很详细)
2015-10-19 00:06 403Log4J的配置文件(Configuration File)就 ... -
CXF与AXIS2 总结
2015-09-30 12:22 1865CXF与AXIS2比较 这两个产品都是Apache孵化器 ... -
从FTP服务器下载文件解压读写
2015-09-25 14:28 2561package junit; import java.io. ... -
面试汇总 很常见
2015-09-24 10:43 556一、String,StringBuffer, Stri ... -
Java注解教程:自定义注解示例,利用反射进行解析
2015-09-23 17:28 381va注解能够提供代码的相关信息,同时对于所注解的代码结构又没有 ... -
基于maven的springmvc + spring + ibatis 集成
2015-09-21 15:47 795pom.xml: [html] view plaincopy ... -
更好的设计你的 REST API(智能家园转载)
2015-09-21 15:10 331REST API 设计在细节上有很多自己独特的需要注意的技巧, ... -
J2EE设计模式-Intercepting Filter
2015-09-21 14:43 488ntercepting Filter类似于职责链模式 有两种 ...
相关推荐
3. `validation-api-1.1.0.cr1.jar`:这是Bean Validation API的实现,包含了JSR303/JSR349规范定义的接口和类,如`javax.validation.Constraint`、`javax.validation.ConstraintValidator`等,是所有JSR303实现的...
JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。JSR 303 用于对 Java Bean 中的字段的值进行验证。 Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对...
JSR 303/Bean Validation提供了一种统一的方式来验证Java对象的属性,使得开发者可以在不侵入业务逻辑的情况下实现数据验证。 在描述中提到的"基于JSR303的参数验证"是指利用JSR 303提供的注解来对方法参数或bean...
2. **hibernate-validator-4.3.2.Final**:这是Hibernate组织提供的JSR 303/JSR 349(Java Bean Validation 1.1)的实现。它包含了一系列的约束注解,如`@NotNull`、`@Size`、`@Pattern`等,以及验证器,用于验证...
为了解决这一问题,开发者们引入了JSR303(Bean Validation)规范,通过插件的形式将其与Mybatis结合,提高了数据验证的便捷性和效率。本文将深入探讨Mybatis JSR303 Bean Validation插件的工作原理及其应用。 JSR...
Hibernate Validator是Hibernate项目的一个子项目,它实现了JSR303和后续的JSR349(Java Bean Validation 1.1)标准。这个jar包为开发者提供了强大的验证功能,可以用于验证对象属性、方法参数等,确保输入数据的...
JSR303主要由JSR349进一步扩展,统称为Bean Validation,是Java世界中处理数据验证的核心规范。它的目标是简化并标准化对象验证,使得开发者能够方便地对业务对象进行约束验证,而无需编写大量的重复代码。通过注解...
3. **验证API**:`validation-api-1.1.0.jar`包含了JSR 303的接口和枚举,如`javax.validation.constraints`包下的各种注解,以及`javax.validation`包下的验证接口和上下文对象。 4. **元数据**:JSR 303支持从元...
1. **Hibernate Validator**:作为JSR 303的实现,Hibernate Validator是领先的Java Bean Validation框架。`hibernate-validator-4.3.2.Final.jar`就是这个实现的版本。它提供了丰富的约束注解,如`@NotNull`, `@...
JSR303(Java Bean Validation)是Java平台上的一个规范,它定义了一种标准的方式来验证对象属性,以满足业务规则。AOP(Aspect Oriented Programming,面向切面编程)则是一种编程范式,它允许程序员定义“切面”,...
Hibernate Validator 是一个强大的Java Bean验证框架,它实现了JSR 303(JavaBeans Validation 1.0)和JSR 349(JavaBeans Validation 1.1)规范,为开发者提供了丰富的数据验证功能。这些规范旨在标准化Java应用...
JSR303还允许自定义验证注解和对应的验证器,通过实现`ConstraintValidator`接口,你可以创建自己的验证逻辑。例如,如果你需要验证邮箱地址的独特性,你可以定义一个`@UniqueEmail`注解,并编写一个对应的验证器。 ...
Spring MVC 和 JSR303 是Java开发中两个重要的组件,它们在构建高效、健壮的Web应用程序中扮演着关键角色。Spring MVC是Spring框架的一部分,用于构建MVC(Model-View-Controller)架构的Web应用,而JSR303(Java ...
`validation-api-1.0.0.GA.jar` 是JSR303规范的核心实现,它提供了一组接口和注解,用于定义和执行对象级别的验证规则。这些注解包括但不限于`@NotNull`、`@Min`、`@Max`、`@Size`等,可以方便地应用到字段上,以...
Spring Core提供了一种优雅的方式来处理参数校验,特别是通过JSR 303、JSR 349和JSR 380这些标准注解,实现了高效且易于维护的验证机制。 JSR 303最初定义了JavaBean验证的标准,而JSR 349是其修订版,主要增加了对...
JSR303,全称为Java Specification Request 303,是Java Community Process(JCP)提出的一个标准,用于在Java应用中实现Bean Validation。这个标准定义了一种规范,允许开发者在模型对象(通常称为Beans)上声明...
JSR303(Java Bean Validation)是Java平台的一个标准,用于进行对象级别的约束验证。下面我们将深入探讨这一主题。 【描述】"服务端JSR303参数校验md"表明这是一个关于如何使用JSR303进行参数验证的学习资料,可能...
在Java世界中,JSR303(也称为Bean Validation)是一个用于验证对象属性的规范,它提供了一种标准化的方式来验证业务对象。JSR303不仅提供了预定义的验证注解,如`@NotNull`, `@Min`, `@Max`等,还允许开发者创建...