【问题标题】:How to close an entitymanager when used with Jackson and Jax-rs与 Jackson 和 Jax-rs 一起使用时如何关闭实体管理器
【发布时间】:2012-05-13 12:55:07
【问题描述】:

我正在使用 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] 在上下文中 path [] 抛出异常 org.codehaus.jackson.map.JsonMappingException: 未能延迟初始化角色集合: com.company.entity.Node.childList,没有会话或会话被关闭 (通过引用链:com.company.entity.Node["childIdList"])

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

【问题讨论】:

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


    【解决方案1】:

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

    该模式称为“在视图中打开会话”。在 stack over flow 中,您可以尝试 Filter do not initialize EntityManager 并在其他地方查看...

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

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

    但您也可以尝试在 google 或 stack over flow 上搜索以获取更多帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-15
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      相关资源
      最近更新 更多