我试图提供一个机会注入任意枚举给定的注入点和字符串值(这是在生产方法中获得)
任意是指如果我有枚举我的和枚举你的,我想用相同的生产者方法注入它们两个或任何其他一个。
所以我尝试了几种方法:1。
@Produces
@MyConfigAnnotation
Enum getArbitraryEnum(InjectionPoint point) {
...
// get string representation,
// instantiate enum using point
return Enum.valueOf((Class<Enum>)injectionPoint.getAnnotated().getClass(), enumValue);
}
2.我将返回类型更改为对象。
在这两种情况下,我都会收到由:org引起的下一个异常。jboss。焊接例外情况。DeploymentException:WELD-001408:在注入点[BackedAnnotatedField]@Inject@X pathToMyField]处带有限定符@X的TestEnum类型的未满足依赖性。测试员2
那么,有没有办法创建一个能够生成任意枚举的products方法呢。
您将需要实例和限定符的独特组合,因为没有限定符,weld不知道调用哪个生产者。
有一种实现动态枚举绑定的方法,我在本文的评论中找到了:http://www.ocpsoft.org/java/how-to-inject-enum-values-into-cdi-beans/
public class InjectedObject {
private MyEnum e1;
private MyEnum e2;
private MyEnum e3;
@Inject
public InjectedObject(@Config("ONE") MyEnum e1, @Config("TWO") MyEnum e2, @Config("THREE") MyEnum e3) {
this.e1 = e1;
this.e2 = e2;
this.e3 = e3;
}
/**
* A producer is required in order to {@link Inject} an Enum
*/
@Produces
@Config
public static MyEnum getEnum(InjectionPoint ip) {
String name = null;
/**
* Iterate over all Qualifiers of the Injection Point to find our configuration and save the config value
*/
for(Annotation a : ip.getQualifiers()) {
if(a instanceof Config) {
name = ((Config) a).value();
}
}
/**
* Iterate over all enum values to match them against our configuration value
*/
for(MyEnum me : MyEnum.values()) {
if(me.toString().equals(name)) {
return me;
}
}
return null;
}
/**
* Our enum
*/
public enum MyEnum { ONE, TWO, FOO }
@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Config {
@Nonbinding String value() default "";
}
}
有趣的部分当然是带有非绑定值的自定义限定符,这导致CDI选择正确的生产者方法。
既然您需要一个额外的限定符,其中包含您要注入的枚举的名称,那么为什么要注入呢?
有一个简单的Mongo DB生产者连接到Mongo数据库 我的src/main/resources/meta-inf中的一个资源文件 WeldContext和WeldJUnit4Runner来自这里-http://memorynotfound.com/java-se-unit-testing-cdi-junit-jboss-weld-se/
像这样上课: 有没有可能告诉Weld不要注射到c中?我可以否决使用事件的类: 但是B物体也不会被注射。我在搜索类似这样的东西:“如果类名是A,字段类型是C,那么省略注入。” 更具体地说,我希望HK2引擎注入“C”字段,问题是HK2和焊接都使用@注入注释。 我尝试了西利亚罗斯的解决方案。我找到了想要添加自定义注入实现的类型,比如: 在我添加了覆盖注入(…)在美国 比如: 在Manager eBVia
我正在学习jboss Weld Event教程中的Weld Event,我想写一个观察事件并在事件被激发时打印helloword的示例。 这是我的代码: 它不起作用,给出以下异常信息: 容器中似乎没有可以初始化的bean 那么我该怎么做才能使它运行,我的beans.xml是空的 也许我应该在beans.xml中做些什么? 或者我应该编写一个实现事件接口的Java类? 任何内容都将适用。
问题内容: 比方说,我有一个名为接口,以及三种实现- ,和。 现在,我希望每当我的托管bean(或任何Web组件)收到一条消息时,便在所有社交网络中共享它。我试过了: 但这没有用(部署错误)。(也尝试了预选赛-同样的结果) 那么,有没有办法注入接口的所有(或某些)实现的列表? 我知道给定注入点不应包含多个可能的bean的规则。我想我可以通过创建一个产生列表的生产者并使用来实现这一点,但这对于这项任
问题内容: 当前,我正在使用PersistenceContext注入EntityManager。EM被完美注入。 现在,我尝试装饰Bean,然后突然没有注入em。我得到一个NullPointerException。 我知道EJB和CDI是2个完全不同的管理器,所以一个都不知道另一个。我期望@PersistenceContext是EJB注入点,而@Inject是CDI。我应该怎么做才能解决这个问题并
问题内容: 我试图将在Spring上下文中定义的bean注入到CDI托管组件中,但没有成功。不会注入Bean,而是在每次执行注入时都会创建一个新实例。我的环境是带有JBoss Weld的Tomcat 7。 Spring ApplicationContext很简单: CDI托管bean如下所示: 这是我的 但是,当我从JSF页面访问属性时,每次访问时都会创建一个新实例。这是一个简单的示例: 我得到以