2012-05-04 1 views
2

J'utilise JPA (hibernate), JAX-RS (Jersey) et Jackson.Comment fermer un gestionnaire d'entité lorsqu'il est utilisé avec Jackson et Jax-rs

Comment puis-je fermer mon gestionnaire d'entités après la construction et l'envoi de mon paquet?

Ce qui suit ne fonctionne pas et me donne une erreur. Il semble appeler em.close() avant que la réponse soit terminée.

@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(); } 
} 

GRAVE: Servlet.service() pour servlet [JAX-RS Servlet] dans le contexte de chemin [] jeta exception org.codehaus.jackson.map.JsonMappingException: Échec de l'initialisation paresseuse une collection du rôle: com.company.entity.Node.childList, aucune session ou session fermée (par la chaîne de référence: com.company.entity.Node [ "childIdList"])

J'utilise les transactions en d'autres méthodes similaires.

Répondre

2

La solution consiste à créer un filtre - qui sera exécuté avant la servlet jaxb qui gère la transaction pour vous. Il y a quelques exemples de ceci sur le net.

Le motif est appelé "Open Session in View". Ici, sur la pile au-dessus de flux, vous pouvez essayer Filter do not initialize EntityManager et regarder ailleurs ... à

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

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

Mais vous pouvez aussi essayer une recherche sur Google ou sur pile sur les flux pour plus d'aide.

Questions connexes