Java EE,CDI - @inject不工作;空值

时间:2014-03-31 19:18:32

标签: java rest cdi java-ee-7

我对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)

1 个答案:

答案 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;
    }
}