您是否使用 JAXB 进行解组?我不熟悉 RESTEasy,虽然我看到它可以使用 JAXB,但我不知道这是否是唯一的选择。
如果您使用的是 JAXB,那么它Unmarshaller
支持Unmarshal Event Callbacks。它可以调用正在解组的对象上的方法,或者更好的是,调用单独的事件侦听器。您可以注册一个侦听器,该侦听器具有对 CDI 的引用BeanManager
(使用简单@Inject
的 或通过 JNDI at 获得java:comp/BeanManager
),并使用它来注入新解组的对象。
我绝不是 CDI 专家,但实验表明这似乎注入了一个已经创建的对象:
public class Injector<T> {
private final BeanManager beanManager;
private final InjectionTarget<T> injectionTarget;
private final Bean<T> bean;
public Injector(BeanManager beanManager, Class<T> cl) {
this.beanManager = beanManager;
injectionTarget = beanManager.createInjectionTarget(beanManager.createAnnotatedType(cl));
bean = resolve(beanManager.getBeans(cl));
}
private Bean<T> resolve(Set<Bean<?>> beans) {
@SuppressWarnings("unchecked")
Bean<T> bean = (Bean<T>) beanManager.resolve(beans);
return bean;
}
public CreationalContext<T> inject(T obj) {
CreationalContext<T> creationalContext = beanManager.createCreationalContext(bean);
injectionTarget.inject(obj, creationalContext);
return creationalContext;
}
}
该代码采用某个类的现有实例并将依赖项注入其中。这是对 CDI 的有点不规则的使用,但它似乎有效(此外,我相信它是完全有效和支持的)。
请注意,调用代码需要保留返回的,并在对象完成后CreationalContext
调用其方法。release