如何与杰克逊和JAX-RS使用时关闭一个EntityManager(How to close an

2019-09-17 01:03发布

我使用JPA(休眠),JAX-RS(新泽西州)和杰克逊。

如何关闭我的实体管理我的包是建立并发出后?

以下不工作,并给我一个错误。 这似乎是调用em.close()完成响应之前。

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getNode( @QueryParam("nodeId") long nodeId ){ 
try {
    Node node = em.find(Node.class, nodeId);        
    if (node == null) throw new WebApplicationException(Response.Status.NOT_FOUND);
    Response response = Response.ok(node, MediaType.APPLICATION_JSON).build(); 
    return response; 
 } 
finally { em.close(); }
}

重度:Servlet.service()进行的servlet [JAX-RS的Servlet]与路径[]上下文抛出异常org.codehaus.jackson.map.JsonMappingException:无法初始化懒洋洋角色的集合:com.company.entity.Node。的childList,没有会话或会话被关闭(通过参考链:com.company.entity.Node [“childIdList”])

我正在使用其他类似的方法交易。

Answer 1:

该解决方案是创建一个过滤器 - 将管理事务为你的servlet JAXB之前运行。 这方面有在网上的几个例子。

该模式被称为“中查看打开会话”。 这里就堆上流过,你可以尝试过滤不EntityManager的初始化和其他地方看看......

http://www.naildrivin5.com/daveblog5000/?p=39

http://chstath.blogspot.com/2007/11/extending-transaction-boundaries-beyond.html

但你也可以尝试在谷歌或堆在流动寻找更多的帮助。



文章来源: How to close an entitymanager when used with Jackson and Jax-rs