为了账号安全,请及时绑定邮箱和手机立即绑定

没有为org.hibernate.proxy.pojo.javassist.Javassist

/ 猿问

没有为org.hibernate.proxy.pojo.javassist.Javassist

慕虎7371278 2019-11-12 12:56:22

我正在处理SpringMVC,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;

    }

我该如何解决?


查看完整描述

3 回答

?
守着一只汪

通过休眠代理对象进行延迟加载时,我遇到了类似的问题。通过用以下方式注释具有延迟加载的私有属性的类来解决此问题:


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

我假设您可以在代理对象上添加打破JSON序列化到该批注的属性。


问题在于实体是延迟加载的,序列化是在实体完全加载之前发生的。


Hibernate.initialize(<your getter method>);


查看完整回答
反对 回复 2019-11-12
?
慕的地2183247

只是为了添加这个,我遇到了同样的问题,但是提供的答案不起作用。我通过采取异常的建议并将其添加到application.properties文件中来对其进行修复...


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

我在Hibernate 4.3中使用Spring Boot v1.3


现在,它将整个对象和嵌套对象序列化。

由于这仍然引起评论,因此我将在此处进行澄清。这绝对只会隐藏错误。性能影响在那里。当时,我需要一些东西来交付并在以后进行处理(通过不再使用spring来完成)。是的,如果您真的想解决此问题,请听别人说。如果您只是想暂时解决,请继续使用此答案。这是一个糟糕的主意,但可能对您有用。记录下来,此后再也没有发生崩溃或问题。但这可能是导致SQL性能噩梦的根源。


查看完整回答
反对 回复 2019-11-12
?
aluckdog

正如先前答案中正确建议的那样,延迟加载意味着从数据库中获取对象时,不会获取嵌套的对象(以后可能会在需要时获取嵌套对象)。


现在,Jackson尝试序列化嵌套对象(==使它成为JSON),但是由于找到JavassistLazyInitializer而不是普通对象而失败。这是您看到的错误。现在,如何解决呢?


如CP510之前建议的那样,一种选择是通过以下配置行来抑制错误:


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

但这是在处理症状,而不是原因。为了优雅地解决它,您需要确定是否需要JSON中的此对象?


如果您需要JSON中的对象,请FetchType.LAZY从导致它的字段中删除该选项(它也可能是某些嵌套对象中的字段,不仅是您要获取的根实体中的字段)。


如果不需要JSON中的对象,请使用来注释此字段的getter(或字段本身,如果您也不需要接受传入的值)@JsonIgnore,例如:



// this field will not be serialized to/from JSON

@JsonIgnore

private NestedType secret;


如果您有更复杂的需求(例如,使用同一实体的不同REST控制器的规则不同),则可以使用杰克逊视图或过滤,或者对于非常简单的用例,可以分别获取嵌套对象。


查看完整回答
反对 回复 2019-11-12

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信