等待答案。
我有一个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..........");
}
}
答案 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;
}
}