public final class StringPropertyLiteral extends AnnotationLiteral<StringProperty> implements StringProperty {
private final String keyValue;
public StringPropertyLiteral(String key) {
keyValue = key;
}
@Override
public String key() {
return keyValue;
}
@Override
public String defaultValue() {
return "";
}
}
现在有也是StringProperty
一个@Produces
我正在尝试使用我的select(new StringP...)
。它正确进入该生产者,但问题是它不能在该代码中获得StringProperty
注释。
更具体地,这意味着,在下面的代码它得到空:
@Produces
@StringProperty
public String stringProperty(InjectionPoint ip) {
StringProperty property = ip.getAnnotated().getAnnotation(StringProperty.class);
return property.defaultValue();
}
的getAnnotation
正在返回null
并在调试器检查它表明它仅有2个注解中,Any
和Inject
注释。同样在注入点的限定符中,我只能找到一个限定符,那就是Any
为什么我的注释文字没有传递给生产者?我在另一种情况下使用了类似的模式,但是select
的目标是一种类型,它不是由生产者获得的,而是它的工作原理。
啊,这很伤心,所以生产者不能访问任何额外的限定符?这个想法是'StringPropertyProducer'进行数据库查找来获取配置。对于某些属性,必须执行'HostConfigPropertyProducer'所要做的额外步骤。我不想重复'StringPropertyProducer'正在做的所有逻辑(因为这来自库) –
通常,生产者可以访问额外的限定符(通过'InjectionPoint'),但*不在你的特定情况下*,因为在那里,注射点只是一个'@Any Instance',这就是你会看到的。你可以做的是在外部构造中存储你需要的信息(我猜是'HostConfigProperty'注释的值) - 比如说,一个你稍后会破坏的bean - 另一个生产者然后读取并根据这些信息做出反应。那有意义吗? –
Siliarus