如何在与Jackson和Jax-rs一起使用时关闭实体管理器

时间:2012-05-04 00:10:30

标签: java java-ee jpa jax-rs jackson

我正在使用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(); }
}
  

SEVERE:用于servlet [JAX-RS Servlet]的Servlet.service()与上下文有关   path []抛出异常org.codehaus.jackson.map.JsonMappingException:   懒得初始化角色集合:   com.company.entity.Node.childList,没有关闭会话或会话   (通过参考链:com.company.entity.Node [“childIdList”])

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

1 个答案:

答案 0 :(得分:2)

解决方法是创建一个过滤器 - 它将在为您管理事务的jaxb servlet之前运行。网上有几个例子。

该模式称为“视图中的开放会话”。在堆叠流程中,您可以尝试Filter do not initialize EntityManager并在其他地方查看...

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

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

但您也可以尝试在Google上或在堆栈上搜索更多帮助。