我已经指定了在Java bean验证中使用的自定义注释。我对我的所有字段使用相同的注释类,并传递一个带有字段名称的字符串参数,如下所示:
@CustomConstraint(value="name")
private String name;
@CustomConstraint(value="address1")
private String addressLine1;我的约束验证器维护一个HashMap,它将字符串键(字段名)映射到我的验证类的接口。我通过将特定字段名与将用于验证字段的接口的具体子类配对来静态初始化此映射,如下所示:
private static final Map<String, CustomValidatorClass> fieldMapper;
static {
Map<String, CustomValidatorClass> map = new HashMap<String, CustomValidatorClass>();
map.put("name", new NameValidator());
map.put("address1", new Address1Validator());
fieldMapper = Collections.unmodifiableMap(map);
}我担心的是这个初始化过程可能非常昂贵(我有几十个字段),并且可能会为我正在验证的每个单独的字段进行初始化。我希望有某种方法来指定注释应该被初始化一次并重用,或者这是默认行为。
编辑:我正在使用JSF2.0和bean-validation,所以我不会直接读取或调用这些注释。这是由框架处理的,这就是为什么我不能确切地确定它是如何操作的。
发布于 2012-09-05 22:30:00
我做了一些测试,似乎只在第一次尝试验证字段时才会调用我在map上执行的静态初始化。这意味着Annotation不会重复初始化,而是在每个字段中重复使用。我对大型初始化开销的担忧现在得到了解决。
发布于 2012-09-05 15:55:00
你的问题不是很清楚,而且你的设计对我来说似乎很奇怪:
value似乎是多余的。@CustomConstraint(value=“字段名称”)
字段类型name-of-field;
@CustomConstraint(validator=NameValidator.class)
字段类型name-of-field;
我相信这是大多数基于注解的验证框架的工作方式,例如spring annotation-based validation。
编辑
我猜要阅读注释,您必须执行以下操作:
for(Field field : cls.getDeclaredFields()){
Class type = field.getType();
String name = field.getName();
Annotation[] annotations = field.getDeclaredAnnotations();
}因此,您知道特定注释如何属于特定字段。
https://stackoverflow.com/questions/12269229
复制相似问题