Инъекция JAX-RS @EJB дает исключение NullPointerException - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь развернуть файл войны для запуска на WildFly Swarm. При выполнении запроса GET возникает исключение NullPointerException, поскольку внедрение не выполняется и ссылка, очевидно, равна нулю.

SomeDao.java

import java.util.List;
import java.util.UUID;

import javax.ejb.Local;

@Local
public interface SomeDao {
    public List<MyEntity> listAll();
    public void store(MyEntity entity);
}

SpecializedDao.java

import java.util.List;
import java.util.UUID;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class SpecializedDao implements SomeDao {
    @PersistenceContext(unitName="primary")
    protected EntityManager entityManager;

    public SpecializedDao() {}

    @Override
    public List<MyEntity> listAll() {
        return this.entityManager
                .createQuery("SELECT entity FROM MyEntity entity", MyEntity.class)
                .getResultList();
    }

    @Override
    public void store(MyEntity entity) {
        entityManager.getTransaction().begin();
        entityManager.persist(entity);
        entityManager.getTransaction().commit();
    }
}

Затем есть конечная точка, куда мне нужно добавить экземпляр SpecializedDao .

MyEndpoint.java

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Stateless
@Path("/something")
public class MyEndpoint {

    @EJB
    private SomeDao dao;

    @GET
    @Path("/test")
    @Produces({MediaType.APPLICATION_JSON})
    public Response test() {
        MyEntity testEntity = new MyEntity("something", "something");

        dao.store(testEntity);

        return Response.ok("All done!").build();
    }


}

beans.xml

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.2" bean-discovery-mode="annotated">
</beans>

NullPointerException запускается в dao.store (testEntity) , потому что dao ссылается на нулевой объект. Я почти уверен, что файл persistence.xml правильный, потому что EntityManager работает с другим тестовым примером, поэтому я думаю, что проблема в инъекции.

Где я сделал что-то не так?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Другие вещи, которые вы можете проверить.

  1. Ваш файл beans.xml находится в правильной папке (например, в WEB-INF в случае webapp / war)?
  2. Включили ли вы долю / зависимость Swarm CDI (org.wildfly.swarm: cdi)?
  3. Я не эксперт по Swarm, но, возможно, фракция CDI работает только тогда, когда бины вводятся «а-ля JSR-299», который использует java.inject.@Inject (а не @EJB).

        @Inject
        private SomeDao dao;
    
  4. В конечном итоге: попробуйте с bean-discovery-mode = "all" в beans.xml (... хотя "аннотированный" кажется правильным)

0 голосов
/ 17 сентября 2018

Разве вы не забыли поместить файл "beans.xml" (в папку WEB-INF / META-INF)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...