正在等待答案
我有一个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);
}
}
listItemDao
在ListItemService
的populateList()
方法中保留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;
}
}