在我的项目中,我从一个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验证器 的实现,它是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映射工具)没有任何共同之处。
如果你需要类似的东西,这个项目还集成了spring MVC。
总之,它确实使用了注解的方法,而且它确实有一些性能上的损失。然而这一切都取决于你有什么样的数据,例如它的速度仍然比做网络调用快得多,所以如果你的项目做这样的事情,可能额外的成本会忽略不计。
反射并不像以前第一个Java版本那么慢,但底线是你应该自己尝试一下,看看它是否适合你的需求。否则我只能猜测。
这里是 你可以找一个关于这个主题的教程,应该是相关的。