我有一个工厂类
@ApplicationScoped /* 'ApplicationScoped' is not a must */
class MyFactory {
@Inject
private IService aService;
...
}
还有一个 JAXB 注释类
@XmlRootElement(name = "item")
class AnItem {
@Inject
MyFactory myFactory;
...
}
AnItem
由 JAXB 从 XML 文件实例化。
问题是 myFactory
是 null
。如果我将其替换为
...
MyFactory myFactory = new MyFactory();
...
然后 myFactory.aService
为空。
如何在 JAXB 创建的类中使用依赖注入(inject)?
最佳答案
以下解决方案的灵感来自 Block of Adam Warski ,另见 BeanManager Javadoc
首先我需要两个实用方法:
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class Utils {
public static BeanManager getBeanManager() {
try {
InitialContext initialContext = new InitialContext();
return (BeanManager) initialContext.lookup("java:comp/BeanManager");
} catch (NamingException e) {
throw new RuntimeException("Failed to retrieve BeanManager!", e);
}
}
public static <T> T getBean(Class<T> c) {
T result = null;
BeanManager bm = getBeanManager();
Set<Bean<?>> beans = bm.getBeans(c);
if (! beans.isEmpty()) {
Bean<?> bean = beans.iterator().next();
result = c.cast(bm.getReference(bean, c, bm.createCreationalContext(bean)));
}
return result;
}
}
Class AnItem
必须像这样改变:
@XmlRootElement(name = "item")
class AnItem {
MyFactory myFactory = Utils.getBean(MyFactory.class);
...
}
关于java - 如何在 JAXB 解码对象中使用依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17453948/