我对Java EE(依赖注入)有些新意,我无法弄清楚为什么@Inject给我null,但是InitialContext.doLookup确实有效。
这是我的豆子。这只是一个DAO。 EntityManager的包装器基本上是
@Stateless
public class PersonManager {
@PersistenceContext("unitName="PersonData")
EntityManager em;
...
}
这是一个REST服务,我试图利用PersonManager:
@Path("/PersonService")
@RequestScoped
public class PersonService {
@Inject private PersonManager manager; //this comes up null
@GET
@Produces("text/html")
public String getAllPersons() {
List<Person> personList manager.findAll(); //null pointer exception, manager null
}
}
现在奇怪的是,如果我在PersonManager上进行查找,它确实有效,如下所示:
@GET
@Produces("text/html")
public String getAllPersons() {
try {
manager = InitialContext.doLookup("java:global/PersonApp/PersonData/PersonManager");
}
catch(Exception e) {
e.printStackTrace();
}
List<Person> personList manager.findAll(); //this works!
}
知道@Inject为什么不在这里工作?我正在使用带有WAR和JAR的EAR,如下所示:
EAR(PersonApp)
- JAR(PersonData - ejb模块 - 包含PersonManager)
- WAR(PersonRest - web模块 - 包含PersonService)
答案 0 :(得分:0)
问题是在其他应用程序注册中将PersonService添加为单例。
@ApplicationPath("api")
public class RestApplication extends Application{
private Set<Object> singletons = new HashSet<Object>();
private Set<Class<?>> empty = new HashSet<Class<?>>();
public RestApplication(){
//below line caused @Inject not to work. commented out
//singletons.add(new PersonService());
}
@Override
public Set<Class<?>> getClasses() {
return empty;
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}