복붙노트

[SPRING] org.hibernate.proxy.pojo.javassist.Javassist 클래스에 대한 serializer가 없습니다.

SPRING

org.hibernate.proxy.pojo.javassist.Javassist 클래스에 대한 serializer가 없습니다.

Spring MVC, Hibernate 및 JSON에서 작업하고 있지만이 오류가 발생합니다.

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) ) 

아래 내 사업체를 확인하십시오.

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

    }

어떻게 해결할 수 있습니까?

해결법

  1. ==============================

    1.hibernate 프록시 객체를 통한 lazy 로딩과 비슷한 문제가있었습니다. 게으른 로딩 된 개인 속성을 가진 클래스에 주석을 달아 주위를 둘러 보았습니다.

    hibernate 프록시 객체를 통한 lazy 로딩과 비슷한 문제가있었습니다. 게으른 로딩 된 개인 속성을 가진 클래스에 주석을 달아 주위를 둘러 보았습니다.

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

    JSON 직렬화를 해당 주석으로 분리하는 프록시 객체의 속성을 추가 할 수 있다고 가정합니다.

    문제는 엔티티가 느슨하게로드되고 직렬화가 완전히로드되기 전에 발생한다는 것입니다.

    Hibernate.initialize(<your getter method>);
    
  2. ==============================

    2.이 문제를 추가하기 위해 동일한 문제가 발생했지만 제공된 답변이 작동하지 않았습니다. 나는 예외의 제안을 받아서 application.properties 파일에 추가함으로써 그것을 고쳤다.

    이 문제를 추가하기 위해 동일한 문제가 발생했지만 제공된 답변이 작동하지 않았습니다. 나는 예외의 제안을 받아서 application.properties 파일에 추가함으로써 그것을 고쳤다.

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

    나는 Hibernate 4.3에서 Spring Boot v1.3을 사용하고있다.

    이제 전체 객체 및 중첩 객체를 직렬화합니다.

    편집 : 2018

    여전히 코멘트를 얻었으므로 여기서 분명히 할 것입니다. 이것은 절대적으로 오류를 숨 깁니다. 성능에 영향이 있습니다. 당시에는 나중에 스프링을 사용하지 않음으로써 제공하고 나중에 작업 할 항목이 필요했습니다. 그래서 네, 정말로 문제를 해결하고 싶다면 다른 사람의 이야기를 들어주십시오. 네가 원한다면 지금 간다.이 대답을 사용하라. 그것은 끔찍한 생각이지만, 당신을 위해 일할 수도 있습니다. 기록을 남기고 나서 충돌이나 문제가 다시 발생하지 않았습니다. 그러나 아마도 SQL 성능의 악몽이 된 원인 일 것입니다.

  3. ==============================

    3.이전 답변에서 올바르게 제안되었으므로 지연로드는 데이터베이스에서 객체를 가져올 때 중첩 객체가 가져 오지 않음을 의미합니다 (나중에 필요할 때 가져올 수 있음).

    이전 답변에서 올바르게 제안되었으므로 지연로드는 데이터베이스에서 객체를 가져올 때 중첩 객체가 가져 오지 않음을 의미합니다 (나중에 필요할 때 가져올 수 있음).

    이제 Jackson은 중첩 된 객체를 직렬화하려고 시도하지만 (== JSON을 생성하지 않음) 정상적인 객체 대신 JavassistLazyInitializer를 찾으면 실패합니다. 이 오류가 표시됩니다. 자, 어떻게 해결할 수 있을까요?

    CP510에서 이전에 제안한 것처럼이 구성 라인을 사용하여 오류를 억제 할 수 있습니다.

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

    그러나 이것은 원인이 아닌 증상을 다루고 있습니다. 이를 우아하게 해결하려면 JSON에서이 객체가 필요한지 여부를 결정해야합니다.

    보다 복잡한 요구 사항 (예 : 동일한 엔티티를 사용하는 다른 REST 컨트롤러에 대한 다른 규칙)을 사용하는 경우 잭슨보기 또는 필터링을 사용하거나 매우 간단한 유스 케이스의 경우 중첩 된 객체를 개별적으로 가져올 수 있습니다.

  4. ==============================

    4.문제는 엔티티를 검색하는 방법이라고 생각합니다.

    문제는 엔티티를 검색하는 방법이라고 생각합니다.

    어쩌면 당신은 다음과 같은 일을하고있을 것입니다 :

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

    로드 대신 get 메소드를 사용해보십시오.

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

    문제는로드 메소드를 사용하면 프록시 만 얻을 수 있지만 실제 객체는 얻지 못한다는 것입니다. 프록시 객체에는 이미로드 된 속성이 없으므로 직렬화가 발생할 때 직렬화 할 속성이 없습니다. get 메소드를 사용하면 실제로 실제 객체를 얻습니다.이 객체는 실제로 직렬화 될 수 있습니다.

  5. ==============================

    5.Hibernate 지연로드를 처리하는 Jackson 용 애드온 모듈을 사용할 수 있습니다.

    Hibernate 지연로드를 처리하는 Jackson 용 애드온 모듈을 사용할 수 있습니다.

    최대 절전 모드 3 및 4를 별도로 지원하는 https://github.com/FasterXML/jackson-datatype-hibernate에 대한 추가 정보

  6. ==============================

    6.이 예외

    이 예외

    왜냐하면, 나는 당신이 Serializable 객체로서 응답 결과를 보내고 있기를 바랍니다. 이것은 봄에 발생하는 문제입니다. 이 문제를 해결하려면 POJO 객체를 응답 출력으로 보내십시오.

    예 :

        @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
    

    POJO 클래스 :

    public class UserVO {
    
        private int Id;
        private String userName;
        private String emailId;
        private String phone;
        private Integer active;
    
    //setter and getters
    

    컨트롤러에서 직렬화 가능한 객체 필드를 POJO 클래스 필드로 변환하고 출력으로 pojo 클래스를 반환합니다.

             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.
    
  7. ==============================

    7.Hibernate 5.2 이상에서는 아래와 같이 최대 절전 모드 프록시를 제거 할 수 있습니다. 그러면 실제 개체를 얻을 수 있으므로 올바르게 직렬화 할 수 있습니다.

    Hibernate 5.2 이상에서는 아래와 같이 최대 절전 모드 프록시를 제거 할 수 있습니다. 그러면 실제 개체를 얻을 수 있으므로 올바르게 직렬화 할 수 있습니다.

    Object unproxiedEntity = Hibernate.unproxy( proxy );
    
  8. ==============================

    8.또는 매퍼를 다음과 같이 구성 할 수 있습니다.

    또는 매퍼를 다음과 같이 구성 할 수 있습니다.

    // 느린 로딩을위한 커스텀 설정

    public static class HibernateLazyInitializerSerializer extends JsonSerializer<JavassistLazyInitializer> {
    
        @Override
        public void serialize(JavassistLazyInitializer initializer, JsonGenerator jsonGenerator,
                SerializerProvider serializerProvider)
                throws IOException, JsonProcessingException {
            jsonGenerator.writeNull();
        }
    }
    

    및 매퍼 구성 :

        mapper = new JacksonMapper();
        SimpleModule simpleModule = new SimpleModule(
                "SimpleModule", new Version(1,0,0,null)
        );
        simpleModule.addSerializer(
                JavassistLazyInitializer.class,
                new HibernateLazyInitializerSerializer()
        );
        mapper.registerModule(simpleModule);
    
  9. ==============================

    9.문제를 일으키는 Hibernate 엔티티 관계가 될 수 있습니다 ... 예를 들어 관련 엔티티의 게으른로드를 중지하십시오 ... customerType에 대해 lazy = "false"를 설정하여 아래에서 해결했습니다.

    문제를 일으키는 Hibernate 엔티티 관계가 될 수 있습니다 ... 예를 들어 관련 엔티티의 게으른로드를 중지하십시오 ... customerType에 대해 lazy = "false"를 설정하여 아래에서 해결했습니다.

    <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>
    
  10. ==============================

    10.나에게 적합한 엔티티 클래스 (모델)에이 주석 추가 이것은 hibernate 프록시 객체를 통한 lazy 로딩을 야기한다.

    나에게 적합한 엔티티 클래스 (모델)에이 주석 추가 이것은 hibernate 프록시 객체를 통한 lazy 로딩을 야기한다.

  11. ==============================

    11.나는 (Annotation 모델 클래스에서) 변경했다.

    나는 (Annotation 모델 클래스에서) 변경했다.

    예쁜 방식으로 일 했어.

    그것을 사랑해.

  12. ==============================

    12.시험

    시험

    Serializable 인터페이스를 구현합니다.

  13. from https://stackoverflow.com/questions/24994440/no-serializer-found-for-class-org-hibernate-proxy-pojo-javassist-javassist by cc-by-sa and MIT license