0

我已经指定了一个用于 Java bean-validation 的自定义注解。我对所有字段使用相同的注释类,并使用字段名称传递一个字符串参数,如下所示:

@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);
}

我担心这个初始化过程可能非常昂贵(我有几十个字段),并且它可能会为我正在验证的每个字段进行初始化。我希望有某种方法可以指定注释应该初始化一次并重用,或者这是默认行为。

编辑:我使用 JSF 2.0 和 bean-validation,所以我不直接阅读或调用这些注释。这是由框架处理的,这就是为什么我无法准确确定它是如何运行的。

4

2 回答 2

0

你的问题不是很清楚,你的设计对我来说似乎很奇怪:

  1. 为什么要复制注释中的字段名称?当您在运行时检查注释时,您知道哪个注释绑定到哪个字段。你的value似乎是多余的。

    @CustomConstraint(value="name-of-field"))

    字段类型字段名称;

  2. 为什么要在静态映射中将字段映射到验证器?您可以使用注释定义此映射:

    @CustomConstraint(validator=NameValidator.class)

    字段类型字段名称;

我相信这就是大多数基于注释的验证框架的运作方式,例如spring 基于注释的验证

编辑

我想要阅读注释,您必须执行以下操作:

for(Field field : cls.getDeclaredFields()){
 Class type = field.getType();
 String name = field.getName();
 Annotation[] annotations = field.getDeclaredAnnotations();
}

因此,您知道特定注释如何属于特定字段。

于 2012-09-05T07:55:00.237 回答
0

我做了一些测试,似乎我在地图上进行的静态初始化只是在我第一次尝试验证字段时才被调用。这意味着注释不会被重复初始化,而是被重复用于每个字段。现在解决了我对大型初始化开销的担忧。

于 2012-09-05T14:29:59.703 回答