Interface-EJB未在no-interface-EJB中注入

时间:2015-09-24 07:21:08

标签: java-ee dependency-injection ejb jax-rs

等待答案。

我有一个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 interface-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);
    }
}

listItemDao的{​​{1}}方法null populateList()仍为ListItemService,导致NullPointerException

这是如何引起的?如何解决?

---编辑和更新---

我试图让Singleton bean在启动时运行(检查我的app逻辑)。 没有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..........");
        }

    }

1 个答案:

答案 0 :(得分:0)

创建以下类有帮助。

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