gpt4 book ai didi

Java EE、CDI - @inject 不起作用;无效的

转载 作者:行者123 更新时间:2023-12-02 02:12:59 25 4
gpt4 key购买 nike

我对 Java EE(依赖注入(inject))有点陌生,我不明白为什么 @Inject 给我 null,但 InitialContext.doLookup 确实有效。

这是我的 bean 。它只是一个 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 在这里不起作用吗?我使用的是 EAR,其中包含 WAR 和 JAR,如下所示:

EAR(PersonApp)

--JAR(PersonData - ejb 模块 - 包含 PersonManager)

--WAR(PersonRest - Web 模块 - 包含 PersonService)

最佳答案

问题原来是在其余应用程序注册中将 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;
}
}

关于Java EE、CDI - @inject 不起作用;无效的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22770261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com