Aucun sérialiseur n'a été trouvé pour class org.hiberner.proxy.pojo.javassist.Javassist?


Je travaille sur SpringMVC, Hibernate & JSON mais je reçois cette erreur.

HTTP Status 500 - Could not write JSON: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) ) 

Veuillez vérifier mon entité ci-dessous

    @Entity
@Table(name="USERS")
public class User {

    @Id
    @GeneratedValue
    @Column(name="USER_ID")
    private Integer userId;

    @Column(name="USER_FIRST_NAME")
    private String firstName;

    @Column(name="USER_LAST_NAME")
    private String lastName;


    @Column(name="USER_MIDDLE_NAME")
    private String middleName;

    @Column(name="USER_EMAIL_ID")
    private String emailId;

    @Column(name="USER_PHONE_NO")
    private Integer phoneNo;

    @Column(name="USER_PASSWORD")
    private String password;

    @Column(name="USER_CONF_PASSWORD")
    private String  confPassword;

    @Transient
    private String token;

    @Column(name="USER_CREATED_ON")
    private Date createdOn;

    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinTable(name = "USER_ROLES", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
    private List<ActifioRoles> userRole = new ArrayList<ActifioRoles>();


    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy="userDetails")
    @Fetch(value = FetchMode.SUBSELECT)
    private List<com.actifio.domain.Address> userAddress = new ArrayList<com.actifio.domain.Address>();

    @OneToOne(cascade=CascadeType.ALL)
    private Tenant tenantDetails;


    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmailId() {
        return emailId;
    }
    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getConfPassword() {
        return confPassword;
    }
    public void setConfPassword(String confPassword) {
        this.confPassword = confPassword;
    }
    public Date getCreatedOn() {
        return createdOn;
    }
    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }

    public List<ActifioRoles> getUserRole() {
        return userRole;
    }

    public void setUserRole(List<ActifioRoles> userRole) {
        this.userRole = userRole;
    }
    public String getMiddleName() {
        return middleName;
    }
    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }
    public Integer getPhoneNo() {
        return phoneNo;
    }
    public void setPhoneNo(Integer phoneNo) {
        this.phoneNo = phoneNo;
    }

    public List<com.actifio.domain.Address> getUserAddress() {
        return userAddress;
    }
    public void setUserAddress(List<com.actifio.domain.Address> userAddress) {
        this.userAddress = userAddress;
    }
    public Tenant getTenantDetails() {
        return tenantDetails;
    }
    public void setTenantDetails(Tenant tenantDetails) {
        this.tenantDetails = tenantDetails;
    }
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }

    }

Comment puis-je résoudre ce problème?

Author: Dan, 2014-07-28

11 answers

J'ai eu un problème similaire avec le chargement paresseux via l'objet proxy hibernate. Contournez-le en annotant la classe ayant des propriétés privées chargées paresseusement avec:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

Je suppose que vous pouvez ajouter les propriétés sur votre objet proxy qui rompt la sérialisation JSON à cette annotation.

Le problème est que les entités sont chargées paresseusement et que la sérialisation se produit avant qu'elles ne soient complètement chargées.

Hibernate.initialize(<your getter method>);
 114
Author: Ankur Singhal, 2018-04-15 07:15:00

Juste pour ajouter cela, j'ai rencontré ce même problème, mais les réponses fournies n'ont pas fonctionné. Je l'ai corrigé en prenant la suggestion de l'exception et en ajoutant à l'application.fichier de propriétés...

spring.jackson.serialization.fail-on-empty-beans=false

J'utilise Spring Boot v1. 3 avec Hibernate 4.3

Il sérialise maintenant l'objet entier et les objets imbriqués.

MODIFIER: 2018

Puisque cela reçoit toujours des commentaires, je vais clarifier ici. Ce absolument ne cache que l'erreur. Les implications de performance sont y. À l'époque, j'avais besoin de quelque chose à livrer et à travailler dessus plus tard (ce que j'ai fait en n'utilisant plus spring). Donc oui, écouter quelqu'un d'autre si vous voulez vraiment résoudre le problème. Si vous voulez juste qu'il disparaisse pour l'instant, allez-y et utilisez cette réponse. C'est une idée terrible, mais ça pourrait marcher pour toi. Pour mémoire, jamais eu de crash ou de problème après cela. Mais c'est probablement la source de ce qui a fini par être un cauchemar de performance SQL.

 51
Author: CP510, 2018-09-13 11:37:19

Comme il est correctement suggéré dans les réponses précédentes, le chargement paresseux signifie que lorsque vous récupérez votre objet dans la base de données, les objets imbriqués ne sont pas récupérés (et peuvent être récupérés plus tard si nécessaire).

Maintenant, Jackson essaie de sérialiser l'objet imbriqué (== en faire JSON), mais échoue car il trouve JavassistLazyInitializer au lieu de l'objet normal. C'est l'erreur que vous voyez. Maintenant, comment le résoudre?

Comme suggéré par CP510 précédemment, une option consiste à supprimer l'erreur en cette ligne de configuration:

spring.jackson.serialization.fail-on-empty-beans=false

Mais c'est qui traite des symptômes, pas de la cause. Pour le résoudre élégamment, vous devez décider si vous avez besoin de cet objet en JSON ou non?

  1. Si vous avez besoin de l'objet dans JSON, supprimez l'option FetchType.LAZY du champ qui le provoque (il peut également s'agir d'un champ dans un objet imbriqué, pas seulement dans l'entité racine que vous récupérez).

  2. Si vous n'avez pas besoin de l'objet dans JSON, annotez le getter de ceci champ (ou le champ lui-même, si vous n'avez pas besoin d'accepter les valeurs) avec @JsonIgnore, par exemple:

    // this field will not be serialized to/from JSON @JsonIgnore private NestedType secret;

Si vous avez des besoins plus complexes (par exemple, des règles différentes pour différents contrôleurs REST utilisant la même entité), vous pouvez utiliser jackson viewsou filtering ou pour un cas d'utilisation très simple, récupérer les objets imbriqués séparément.

 41
Author: MF.OX, 2016-05-25 18:04:21

Je pense que le problème est la façon dont vous récupérez l'entité.

Peut-être que vous faites quelque chose comme ceci:

Person p = (Person) session.load(Person.class, new Integer(id));

Essayez d'utiliser la méthode get au lieu de load

Person p = (Person) session.get(Person.class, new Integer(id));

Le problème est qu'avec la méthode load, vous obtenez juste un proxy mais pas l'objet réel. L'objet proxy n'a pas les propriétés déjà chargées, donc lorsque la sérialisation se produit, il n'y a pas de propriétés à sérialiser. Avec la méthode get, vous obtenez réellement l'objet réel, cet objet pourrait fait être sérialisé.

 12
Author: Carlos Zegarra, 2016-03-13 06:59:24

Vous pouvez utiliser le module complémentaire pour Jackson qui gère le chargement paresseux Hibernate.

Plus d'infos sur https://github.com/FasterXML/jackson-datatype-hibernate qui prennent en charge hibernate 3 et 4 séparément.

 9
Author: Marco Andreini, 2014-12-23 09:37:48

Dans Hibernate 5.2 et supérieur, vous pouvez supprimer le proxy hibernate comme ci-dessous, il vous donnera l'objet réel afin que vous puissiez le sérialiser correctement:

Object unproxiedEntity = Hibernate.unproxy( proxy );
 2
Author: GMsoF, 2018-07-05 06:04:17

Essayer

implements interface Serializable

 0
Author: borino, 2014-07-28 15:06:07

Ou vous pouvez configurer mapper comme:

// configuration personnalisée pour le chargement paresseux

public static class HibernateLazyInitializerSerializer extends JsonSerializer<JavassistLazyInitializer> {

    @Override
    public void serialize(JavassistLazyInitializer initializer, JsonGenerator jsonGenerator,
            SerializerProvider serializerProvider)
            throws IOException, JsonProcessingException {
        jsonGenerator.writeNull();
    }
}

Et configurer le mappeur:

    mapper = new JacksonMapper();
    SimpleModule simpleModule = new SimpleModule(
            "SimpleModule", new Version(1,0,0,null)
    );
    simpleModule.addSerializer(
            JavassistLazyInitializer.class,
            new HibernateLazyInitializerSerializer()
    );
    mapper.registerModule(simpleModule);
 0
Author: ahll, 2016-08-26 10:59:05

Il pourrait s'agir de votre relation d'entité Hibernate à l'origine du problème...arrêtez simplement le chargement paresseux de cette entité associée...exemple...J'ai résolu ci-dessous en définissant lazy="false" pour customerType.

<class name="Customer" table="CUSTOMER">
        <id name="custId" type="long">
            <column name="CUSTID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="phone" type="java.lang.String">
            <column name="PHONE" />
        </property>
        <property name="pan" type="java.lang.String">
            <column name="PAN" />
        </property>

        <many-to-one name="customerType" not-null="true" lazy="false"></many-to-one>
    </class>
</hibernate-mapping>
 0
Author: bjethwan, 2017-01-28 17:50:36

Cette exception

Org.springframework.http.convertisseur.HttpMessageNotWritableException

Obtenir parce que, je l'espère, vous envoyez une sortie de réponse en tant qu'objet sérialisable.
C'est un problème qui se produit au printemps. Pour surmonter ce problème, envoyez un objet POJO en sortie de réponse.

Exemple :

    @Entity
    @Table(name="user_details")
    public class User implements Serializable{

        @Id
        @GeneratedValue(strategy= GenerationType.IDENTITY)
        @Column(name="id")
        private Integer id;

        @Column(name="user_name")
        private String userName;

        @Column(name="email_id")
        private String emailId;

        @Column(name="phone_no")
        private String phone;

//setter and getters

Classe POJO:

public class UserVO {

    private int Id;
    private String userName;
    private String emailId;
    private String phone;
    private Integer active;

//setter and getters

Dans le contrôleur, convertissez les champs d'objet sérialisables en champs de classe POJO et renvoyez la classe pojo comme sortie.

         User u= userService.getdetials(); // get data from database

        UserVO userVo= new UserVO();  // created pojo class object

        userVo.setId(u.getId());
        userVo.setEmailId(u.getEmailId());
        userVo.setActive(u.getActive());
        userVo.setPhone(u.getPhone());
        userVo.setUserName(u.getUserName());
       retunr userVo;  //finally send pojo object as output.
 0
Author: Sai Goud, 2018-03-04 19:15:37

Ajoutez cette annotation à la classe d'entité (Modèle) qui fonctionne pour moi cela provoque un chargement paresseux via l'objet proxy hibernate.

@JsonIgnoreProperties({"hibernateLazyInitializer", "gestionnaire"})

 0
Author: Akitha_MJ, 2018-09-03 11:19:15