2017-03-22 12 views
0

制作动态例如我有一个生产类看起来像这样没有得到注解

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

为什么我的注释文字没有传递给生产者?我在另一种情况下使用了类似的模式,但是select的目标是一种类型,它不是由生产者获得的,而是它的工作原理。

回答

0

这里的困惑是InjectionPoint是如何工作的。当您进行动态选择(Instance#select())时,它不会创建新的注射点。它仍然会参考您的原始注射点。 例如在你的第二个生产你这样做:

public String stringProperty(InjectionPoint ip) { 
    StringProperty property = ip.getAnnotated().getAnnotation(StringProperty.class); 

然而,注射点你在这里将是原来

@Any 
@Inject 
Instance<String> baseUriInstance; 

正因为如此,这个IP没有注释你请求(StringProperty),因此值为null

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

+0

啊,这很伤心,所以生产者不能访问任何额外的限定符?这个想法是'StringPropertyProducer'进行数据库查找来获取配置。对于某些属性,必须执行'HostConfigPropertyProducer'所要做的额外步骤。我不想重复'StringPropertyProducer'正在做的所有逻辑(因为这来自库) –

+0

通常,生产者可以访问额外的限定符(通过'InjectionPoint'),但*不在你的特定情况下*,因为在那里,注射点只是一个'@Any Instance ',这就是你会看到的。你可以做的是在外部构造中存储你需要的信息(我猜是'HostConfigProperty'注释的值) - 比如说,一个你稍后会破坏的bean - 另一个生产者然后读取并根据这些信息做出反应。那有意义吗? – Siliarus

相关问题