Exception levée lors de la sérialisation d'Hibernate objet JSON
Eh bien, je suis de l'utilisation d'Hibernate pour charger une petite base de données pour certaines classes représentant les tables et d'interagir avec la base de données.
Tous très bien, et je peux vraiment voir tous les résultats... Et je n'ai pas de champ nul, tous d'entre eux sont été utilisés.
Ici je montre à la classe "main" (tableau).
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonProperty;
@JsonAutoDetect
public class Advertisement
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int id;
public SessionT session;
public int idRoom;
public String image;
public Advertisement()
{
}
/* Getters and Setters */
@JsonProperty
public int getID() /* Get example */
{
return this.id;
}
}
Et aussi
@JsonAutoDetect
public class SessionT
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int id;
public int iStatus;
public String sStatus;
public Date dtDateStart;
public Date dtDateEnd;
public boolean bhide;
/* Constructor, Getter and Setters*/
}
Mon objectif est de générer un JSON à partir d'une LISTE de Publication et d'envoyer via Http.
ObjectMapper mapper = new ObjectMapper();System.out.println("mapper started!");
mapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
response.getOutputStream().println(mapper.writeValueAsString(ads));
Et pour une raison que j'obtiens l'erreur suivante:
org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: java.util.ArrayList[0]->entities.slave.Advertisement["session"]->entities.slave.SessionT_$$_javassist_2["hibernateLazyInitializer"])
Je suis en utilisant jackson-tous-1.9.11 et JBoss Studios 6.01
Quelqu'un peut m'aider??
Vous devez vous connecter pour publier un commentaire.
Quand Hibernate charges objets à partir de la DB, il retourne en proxy objets qui ressemblent à votre Publicité ou SessionT mais ont plus de "trucs" en eux (pour gérer leur relation à la session, de l'état interne de paresseux chargé des collections etc.).
Ce qui perturbe la Jackson sérialiseur puisqu'il repose sur l'introspection pour trouver notre les propriétés des objets.
Il y a un projet pour permettre à Jackson de travailler avec les entités Hibernate. Voir: https://github.com/FasterXML/jackson-datatype-hibernate.
Peut vous pouvez essayer avec
Ou une approche assez simple consiste à annoter chaque getter manuellement avec @JsonProperty
Comme
Christophe L
mentionnés ci-dessus, utiliser la veille prolongée module: https://github.com/FasterXML/jackson-datatype-hibernate -- sinon Jackson a aucun moyen de savoir comment gérer les types spécifiques d'une bibliothèque tierce.Aussi, Jackson 2.x a un meilleur support pour tels types, de sorte que, si possible, Jackson 2.2 avec Hibernate module serait plus un choix optimal. Mais je comprends que la mise à niveau n'est pas toujours facile ou possible.
Si vous avez une Entité qui a une relation avec une autre Entité, Hibernate remplace la Liste ou référencé dans la Classe avec un soi-disant PersistenceBag. Cela permet de faire quelques lazy loading. Je pense que ce qui se passe avec votre attribut de session.
Vous devriez être en mesure de voir que dans le débogueur à droite après le chargement Publicité de DB, si je suis à droite.
Je ne sais pas comment le sérialiseur Json gère cette mise en veille prolongée-magie. Peut-être que vous devez copier votre entité dans un pojo dto (une classe sans aucune mise en veille prolongée-Contexte) de la première et de sérialiser que dto json...
Mais peut-être qu'il y a de meilleures façons de le faire. Vous pouvez essayer de désactiver le chargement différé, mais je ne suis pas shure si cela change vraiment hiberne comportement...