未在无接口 EJB 中注入接口 EJB

Interface-EJB not injected in no-interface-EJB

等待答案。

我有一个 JAX-RS 控制器(WildFly 9.0 上的 Jersey 2.21)。

@Named
@Path("v1/populateList/")
public class PopulateDataController {

    @EJB
    ListItemService listItemService;

    @GET
    @Path("auto")
    @Produces(MediaType.TEXT_PLAIN)
    public String populateList(){
        listItemService.populateList();
        return "done";
    }
}

下面的 ListItemService 无接口 EJB 成功注入上面的 JAX-RS 控制器。

@Stateless
public class ListItemService {

    @EJB
    ListItemDao listItemDao;

    public void populateList(){
        listItemDao.persist();
    }
}

但是下面的ListItemDaoImpl接口EJB并没有依次注入到上面的无接口EJB中。

@Stateless
public class ListItemDaoImpl implements ListItemDao{

    @PersistenceContext(unitName = "pu")
    private EntityManager em;

    public void persist(){
        ListItem listItem = new ListItem();
        listItem.setLevel(1);
        listItem.setName("item1");
        em.persist(listItem);
    }
}

listItemDaoListItemServicepopulateList() 方法中保留 null,导致 NullPointerException

这是怎么造成的,我该如何解决?

---编辑更新---

我试图在启动时为 运行 创建一个 Singleton bean(以检查我的应用程序逻辑)。 它在没有 JAX RS 的情况下工作正常。所以很明显,问题不在于 EJB,而在于 JAX RS。(如果有误,请纠正我)

    @Singleton
    @Startup
    public class TestController {
        @EJB
        ListItemService listItemService;

        @PostConstruct
        void test(){
        System.out.println("starting..........");
        listItemService.populateList();
        System.out.println("ending..........");
        }

    }

创建以下 class 有帮助。

    @javax.ws.rs.ApplicationPath("api")
    public class InjectionApplication extends javax.ws.rs.core.Application {
        private Set<Object> singletons = new HashSet<Object>();
        private Set<Class<?>> classes = new HashSet<Class<?>>();

        public InjectionApplication() {
        // no instance is created, just class is listed
        classes.add(ListItemController.class); //replace with yours
        classes.add(ParseFeedController.class); //replace with yours
        //add more or use some auto class finding technique

        }

        @Override
        public Set<Class<?>> getClasses() {
        return classes;
        }

        @Override
        public Set<Object> getSingletons() {
        return singletons;
        }
    }