Из-за ограничений рамки, которую я должен использовать, мне нужно вводить в существующие экземпляры объектов (они не могут быть созданы как обычно с помощью самого CDI) , Мои точки инъекции отмечены либо @EJB
, либо @Inject
.CDI Injection в существующий экземпляр объекта - работал с CDI 1.0, но не с CDI 1.1
С JBoss EAP 6.4, Java EE 6 и CDI 1.0 это работало прекрасно со следующим кодом:
public class DispatcherUtils {
public static <T> void inject(T anObject) {
BeanManager beanManager = getBeanManager();
Class<T> objClass = (Class<T>) anObject.getClass();
AnnotatedType<T> annotatedType = beanManager.createAnnotatedType(objClass);
InjectionTarget<T> injectionTarget = beanManager.createInjectionTarget(annotatedType);
CreationalContext<T> context = new IgnorantCreationalContext<>();
injectionTarget.inject(anObject, context);
injectionTarget.postConstruct(anObject);
}
private static BeanManager getBeanManager() {
try {
return (BeanManager) InitialContext.doLookup("java:comp/BeanManager");
} catch (final NamingException e) {
e.printStackTrace();
}
return null;
}
}
Если я пытаюсь сделать то же самое в JBoss EAP 7.0, Java EE 7 и CDI 1.1 только точки инъекции, помеченные @Inject
, вводятся в целевые объекты, те, которые помечены @EJB
, не вводятся (их значение остается равным нулю).
Я не понимаю, почему это так.
Есть ли способ впрыскивания в существующие объекты с JBoss EAP 7.0, Java EE 7 и CDI 1.1, а также для заполнения точек впрыска @EJB
?
Update, 2016-06-19, 20:11
Я только что обнаружил, что вышеуказанная модель работает до тех пор, как объект, я хочу, чтобы ввести в имеет конструктор без аргументов.
Пример - это работает:
public class ExampleBean {
private Dispatcher dispatcher;
@Inject
private SomeCdiBean someCdiBean;
@EJB
private SomeEjbService someEjbService;
public ExampleBean() {
}
public ExampleBean(Dispatcher dispatcher) {
this.dispatcher = dispatcher;
}
}
а в этом не работает:
public class ExampleBean {
private Dispatcher dispatcher;
@Inject
private SomeCdiBean someCdiBean;
@EJB
private SomeEjbService someEjbService;
public ExampleBean(Dispatcher dispatcher) {
this.dispatcher = dispatcher;
}
}
Почему проверка CDI наличие конструктора по умолчанию в таком случае? (Примечание: фасоль не создан КДИ, поэтому конструктор не имеет никакого значения)
Как выглядит ваш «IgnorantCreationContext»? DeltaSpike имеет ту же функцию, и отлично работает на Wildfly 10: https://github.com/apache/deltaspike/blob/master/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/ api/provider/BeanProvider.java # L448, возможно, вы бы подумали об этом? –
Это мой «IgnorantCreationContext» https://gist.github.com/t3chris/36d627528b5d059a272afd4ed8ccd148 Я также пробовал с Deltaspike, но видел тот же результат '@ Inject', но' @ EJB' остается с нулевым значением , – t3chris
@JohnAment: Я обновил свой первоначальный вопрос. Вы видите какой-либо способ заставить CDI игнорировать отсутствие конструктора по умолчанию? – t3chris