Исключение NullPointerException при внедрении с помощью @EJB

#dependency-injection #nullpointerexception #ejb #websphere-liberty #java-ee-8

#внедрение зависимостей #исключение nullpointerexception #ejb #websphere-liberty #java-ee-8

Вопрос:

у меня возникают проблемы при внедрении моих компонентов с аннотацией @EJB — компоненты всегда равны нулю…

Во-первых, вот соответствующая часть моей структуры проекта.

 ApplEAR.ear
|
├──WebModule.war (de.example.rest)
└──EJBModule.war (de.example.service)
  

Итак … теперь я пытаюсь внедрить компонент из ejbmodule в мой веб-модуль:

de.example.rest.RestBean:

 @Stateless(name = "RestBean")
@Path("/restElements")
public class RestBean implements IRestBean {
    
    @EJB
    private UserBean userBean;
  

de.example.service.Пользовательское значение:

 @Stateless(name = "UserBean")
@TransactionManagement(TransactionManagementType.BEAN)
@LocalBean
public class UserBean{...
  

И в моем веб-модуле у меня есть этот класс для расширения класса приложения:

 @ApplicationPath("/*")
public class RestApplication extends javax.ws.rs.core.Application {
    /**
     * {@inheritDoc}
     */
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(de.example.rest.RestBean.class);
        return classes;
    }
}
  

Ear развертывается на сервере websphere liberty с этими установленными функциями:

 <feature>localConnector-1.0</feature>
<feature>appSecurity-3.0</feature>
<feature>beanValidation-2.0</feature>
<feature>ejbLite-3.2</feature>
<feature>ejbRemote-3.2</feature>
<feature>javaMail-1.6</feature>
<feature>jca-1.7</feature>
<feature>jdbc-4.2</feature>
<feature>jndi-1.0</feature>
<feature>jpaContainer-2.2</feature>
<feature>jsf-2.3</feature>
<feature>jsp-2.3</feature>
<feature>ldapRegistry-3.0</feature>
<feature>servlet-4.0</feature>
<feature>transportSecurity-1.0</feature>
<feature>websocket-1.1</feature>
<feature>jaxws-2.2</feature>
<feature>jaxrs-2.1</feature>
  

Я пробовал разные вещи, чтобы решить мою проблему:
Создание beans.xml в каждой папке WEB-INF / META-INF,
попробуйте использовать @LocalBean и @Local-interface — и введите интерфейс,
используя @EJB(lookup = «java:global/ApplEAR/EJBModule/UserBean!de.example.service.UserBean»),
вместо этого используя @Inject .

С помощью

 InitialContext ctx = new InitialContext();
            Object service = ctx.lookup(java:global/ApplEAR/EJBModule/UserBean!de.example.service.UserBean);
  

Я могу выполнить поиск компонента, но это было бы проще с помощью аннотаций.

Итак, что я упускаю или делаю неправильно?

Комментарии:

1. С какой версией WebSphere Liberty вы работаете?

2. я использую liberty 20.0.0.8

3. Важно ли для вас использовать RestBean как EJB (в дополнение к маркировке его как ресурса JAX-RS)? Или вы просто экспериментировали, пытаясь ввести UserBean?

Ответ №1:

Я собираюсь дать ответ без объяснения причин (поскольку я не мог описать все нюансы внедрения EJB и CDI в JAX-RS, спецификации и т. Д.).

Вы можете ввести UserBean в RestBean, удалив аннотацию EJB из RestBean и добавив @Dependent , чтобы преобразовать ее в компонент, управляемый CDI.

 // ... 
import javax.enterprise.context.Dependent;

//@Stateless(name = "RestBean")
@Path("/restElements")
@Dependent
public class RestBean implements IRestBean {
  

Это предполагает, что вам не нужно использовать RestBean, скажем, как удаленный EJB, и вы согласны использовать его только как компонент, управляемый CDI, и / или ресурс JAX-RS.

(Примечание: это предполагает, что у вас включена функция CDI, что вы и делаете, транзитивно / косвенно).