Я пытаюсь выяснить, как объект-экземпляр работает в Java EE. Я заметил, что я получаю исключение NullPointerException, если я пытаюсь получить доступ к члену, который должен быть введен через @EJB, если класс, определяющий элемент, был явным образом определен мной, а не контейнером. Мое заключение состоит в том, что даже если бит будет отмечен как управляемый, это не значит, что он не позволяет контейнеру его создавать. Можем ли мы заставить контейнер управлять такими объектами?Injecting @EJB в явно созданный объект -> NullPointerException
Предположим, что у нас есть следующая настройка: можно ли было бы создавать (явно) ClassB в ClassC и иметь ClassB вызывать метод из ClassA, не бросая исключение NullPointerException?
@Stateless
public class ClassA {
public void bar() {
// Does something fun
}
}
@Stateless
public class ClassB {
@EJB
private ClassA A;
public void foo() {
A.bar(); // throws NullPointerException if ClassB
// is explicitly instantiated works fine
// if injected with @EJB
}
}
public class ClassC {
//@EJB // Only way to go? Can we choose an implementation of ClassB?
private ClassB B;
public ClassC() {
this.B = new ClassB(); // Bad idea? Possible??
this.B.foo();
}
}
Причина Я ищу в него, потому что я в моем, эквивалент, ClassA нужно использовать EntityManager сохраняться некоторые данные, в то же время мой ClassB на самом деле интерфейс, поэтому мне нужно быть в состоянии решить во время выполнения, для реализации которого необходимо создать экземпляр в ClassC. Может быть, есть другие способы сделать это?
Вы не можете создать экземпляр EJB с «новыми» ключевыми словами, это не вариант. Чтобы отнести к классу ejb, вы либо сделали контейнер, либо загрузили через JNDI. Каждый выбор имеет свой смысл, который вы используете на другом или другом подходе в зависимости от контекста. – Leonardo