在我的项目中,我正在从json文件加载配置(使用gson(,正如您可能知道的,丢失的字段将用空字符串填充。
其中一些字段是强制性的,另一些字段必须大于X,我想验证它
简单(也是丑陋(的方法是对每个属性使用if条件,比如:
if (StringUtils.isEmpty(sftpConfiguration.getHostName)) {
logger.error (“hostName property is mandatory”);
// etc.
}
但是,我有不止一个字段,将来还会添加越来越多的属性,因此我构建了两个注释,称为NorNullEmpty
和GreaterThen
(具有value属性(,并运行抛出字段,如下所示:
public static boolean validateWithAnnotation(Object object) throws IllegalAccessException {
boolean result = true;
Field[] classFields = object.getClass().getDeclaredFields();
for (Field field : classFields) {
if (field.getAnnotation(NorNullEmpty.class) != null) {
if (field.getType() == String.class) {
field.setAccessible(true);
String value = (String) field.get(object);
if (StringUtils.isEmpty(value)) {
result = false;
logger.error("Property {} is mandatory but null or an empty.", field.getName());
}
field.setAccessible(false);
} else {
logger.warn("@NorNullEmpty annotation is working on String type only.");
}
} else if (field.getAnnotation(GreaterThan.class) != null) {
Class<?> fieldType = field.getType();
if (fieldType == long.class || fieldType == Long.class) {
field.setAccessible(true);
Long val = field.getLong(object);
if (val <= field.getAnnotation(GreaterThan.class).value()) {
result = false;
logger.error("Property {} value is {} and it must be greater than {}.", field.getName(), val, field.getAnnotation(GreaterThan.class).value());
}
field.setAccessible(false);
}
}
}
return result;
}
当我用拼贴做代码审查时,他非常害怕注释的使用,"这非常危险,成本也非常昂贵"。。
我很高兴知道你的想法,我应该为每个字段使用一个简单的愚蠢if吗?继续反思?或者我应该使用其他方式验证字段?
注意:不要使用Spring/Hibernate。
首先,您正在尝试重新发明轮子。有一个名为Hibernate Validator的项目,它是bean验证参考规范的实现。
下面是他们登陆页面上的一个例子:
public class Car {
@NotNull
private String manufacturer;
@NotNull
@Size(min = 2, max = 14)
private String licensePlate;
@Min(2)
private int seatCount;
// ...
}
因此,您定义验证并运行引擎,它将执行所有检查并返回错误(如果有(。您甚至可以进行自己的验证,这使其具有可扩展性。
需要注意的是,这个项目与Hibernate(一个在java世界中很有名的ORM映射工具(没有任何共同之处。
如果你需要的话,这个项目还集成了springMVC。
不管怎样,它确实使用了注释方法,而且确实存在一些性能损失。然而,这完全取决于你有什么样的数据,例如,它仍然比进行网络调用快得多,所以如果你的项目这样做,可能额外的成本可以忽略不计。
反射不像最初的Java版本那样慢,但最重要的是,您应该试着看看它是否符合您的需求。否则我只能推测。
在这里你可以找到关于这个主题的教程,应该是相关的