动态实例的生产者没有获得注释

时间:2017-03-22 13:16:17

标签: java jboss cdi

我的生产者类看起来像这样:

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个注释,AnyInject注释。同样在注入点的限定符中,我只能找到一个限定符,即Any

为什么我的注释文字没有传递给制作人?我在另一个上下文中使用了类似的模式,但是select的目标是一个类型,它不是由生产者获得的并且有效。

1 个答案:

答案 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值。

这根本不起作用,你需要解决它。我可能需要看到更多的代码来帮助你。这似乎是一种不寻常的设计链接这样的生产者电话。