我的生产者类看起来像这样:
public class HostConfigPropertyProducer {
@Any
@Inject
Instance<String> baseUriInstance;
@Produces
@HostConfigProperty
String produce(InjectionPoint ip) {
HostConfigProperty property = ip.getAnnotated().getAnnotation(HostConfigProperty.class);
Instance<String> baseUriCandidate = baseUriInstance.select(new StringPropertyLiteral(property.key()));
return baseUriCandidate.get();
}
}
StringPropertyLiteral看起来像这样:
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 "";
}
}
现在,我正在尝试使用@Produces
调用StringProperty
select(new StringP...)
。它正确地进入了该生产者,但问题是它无法在该代码中获得StringProperty
注释。
更具体地说,这意味着在以下代码中它变为null:
@Produces
@StringProperty
public String stringProperty(InjectionPoint ip) {
StringProperty property = ip.getAnnotated().getAnnotation(StringProperty.class);
return property.defaultValue();
}
getAnnotation
正在返回null
并在调试器中检查它显示它只有2个注释,Any
和Inject
注释。同样在注入点的限定符中,我只能找到一个限定符,即Any
为什么我的注释文字没有传递给制作人?我在另一个上下文中使用了类似的模式,但是select
的目标是一个类型,它不是由生产者获得的并且有效。
答案 0 :(得分:0)
这里的混淆是InjectionPoint
的工作原理。当您进行动态选择(Instance#select()
)时,它不会创建新的注入点。它仍将参考您的原始注射点。
例如。在你的第二个制作人中你这样做:
public String stringProperty(InjectionPoint ip) {
StringProperty property = ip.getAnnotated().getAnnotation(StringProperty.class);
但是,您在此处获得的注入点将是原始:
@Any
@Inject
Instance<String> baseUriInstance;
因此,此IP没有您请求的注释(StringProperty
),因此null
值。
这根本不起作用,你需要解决它。我可能需要看到更多的代码来帮助你。这似乎是一种不寻常的设计链接这样的生产者电话。