被称为脱离上下文的无状态会话bean缺少EntityManager

时间:2012-11-06 20:46:41

标签: java java-ee persistence entitymanager stateless-session-bean

我是Java EE的新手,所以我的问题可能非常基础。我使用无状态会话bean(简称)构建了以下REST Web服务:

@Path("/list/")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Stateless
public class ListResource {

    @PersistenceContext(unitName = "unitName")
    private EntityManager em;

    @GET
    @Path("/")
    public List<Compound> getCompounds() {

    List<Compound> list = tq.getResultList();

    if (list.isEmpty()) {
        throw new WebApplicationException(Response.status(404).entity("There are no compounds in database.").build());
    }

    return list;
    }
}

它就像魅力一样。它可以通过URL访问并返回JSON。问题是我用普通Java编写的程序的另一部分需要使用这个Session bean作为获取所有化合物的某种模型。

问题是当我在某个地方初始化这个Session bean时,它不在持久化上下文中,因此不知道EntityManager来访问数据库。我相信。

我不知道该怎么做。我可以在远程代码部分初始化类ListResource并使EntityManager的依赖注入工作吗?或者以某种方式获得持久化上下文然后初始化这个会话bean?

我希望这是有道理的。我要描述的问题很复杂。

2 个答案:

答案 0 :(得分:0)

(我还不能写评论,所以我稍后会更新这个答案)

请描述你的意思“我有用普通Java编写的程序的另一部分”。这是一个独立的Java程序,它有一个主要的方法吗?

依赖注入将适用于“托管类”,如Servlet,JSF ManagedBean或CDI bean。

您仍然可以远程调用此会话Bean。您的环境是什么(Java EE版本,应用服务器)?

答案 1 :(得分:0)

如果您有一个Web服务和一个调用同一个bean的独立应用程序,我建议您在单独的无状态bean中移动该功能,并为其创建远程和本地接口。这样,您可以将本地bean注入到您的Web服务bean中,并使用jndi调用远程bean。

有关访问Java EE bean here的更多信息。

或者,您的客户端Java代码可以调用Web服务来获取所有数据。有关连接RESTful服务的方法,请参阅this question

相关问题