未在无接口EJB中注入接口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";
    }
}

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

@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..........");
        }
    }

创建以下类有帮助。

    @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;
        }
    }

最新更新