java - 如何在 JAXB 解码对象中使用依赖注入(inject)?

标签 java dependency-injection jaxb cdi

我有一个工厂类

@ApplicationScoped /* 'ApplicationScoped' is not a must */
class MyFactory {

   @Inject
   private IService aService;

   ...
}

还有一个 JAXB 注释类

@XmlRootElement(name = "item")
class AnItem {

  @Inject
  MyFactory myFactory;

  ...
}

AnItem 由 JAXB 从 XML 文件实例化。 问题是 myFactorynull。如果我将其替换为

...
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/

相关文章:

java - 无法使用 Swing 登录

java - 如何在RSA 7.5.5.3中设置PMD?

java - @XmlElementRef 问题 : Invalid XmlElementRef on property {property}, 引用的元素未声明

jaxb - MOXy如何处理空数组

java - 添加 DOCTYPE 以改造 POST xml 请求正文

java - 如何将 int 转换/转换为对象? (java)

c# - 构造函数注入(inject)的实现具有未使用的 dll 依赖项

java - 安卓刀柄。是否可以将一个 ViewModel 注入(inject)另一个 ViewModel 中?

php - 疙瘩和动态构造函数注入(inject)

java - 如何让 Apache POI 和 JAXB 协同工作?