未在无接口 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);
}
}
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..........");
}
}
创建以下 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;
}
}
等待答案。
我有一个 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);
}
}
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..........");
}
}
创建以下 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;
}
}