Spring Data Rest:使用LAZY对象的实体序列化导致JsonMappingException

时间:2016-07-13 11:09:35

标签: spring-mvc spring-data-jpa spring-data-rest

我在Spring Data Rest项目中遇到以下异常:

com.fasterxml.jackson.databind.JsonMappingException: 
    No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer 
(to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) 
(through reference chain: org.springframework.data.rest.webmvc.json.["content"]->test.spring.data.rest.xml.entities.Author_$$_jvstb93_1["handler"])

当然,我有一些实体具有fetch配置= FetchType.LAZY。

我遵循了许多说明和链接,但我仍然有这个例外。

我已经尝试过的事情(没有效果):

  • 在扩展RepositoryRestMvcConfiguration的配置类中添加@EnableHypermediaSupport(type = HypermediaType.HAL)

  • @Override configureJacksonObjectMapper在同一个班级中,同时使用Jackson2DatatypeHelper.configureObjectMapper()

    @Override
    protected void configureJacksonObjectMapper(ObjectMapper objectMapper) {
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        Jackson2DatatypeHelper.configureObjectMapper(objectMapper);
    }
    
  • 添加" org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter"在web.xml中过滤

  • 使用此构造函数创建extends ObjectMapper的自定义类:

    public HibernateAwareObjectMapper() {
        Hibernate5Module hm = new Hibernate5Module();
        registerModule(hm);
    }
    

    和这个配置:

    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="test.spring.data.rest.xml.config.HibernateAwareObjectMapper" />
            </property>
        </bean>
    </mvc:message-converters>
    

上述任何一项行动都没有解决问题!

如何(绝对)解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:4)

我找到了解决这个烦人问题的方法。

对于Spring Data Rest应用程序的每个存储库,必须定义一个自定义@Projection;在预测中将有必需品领域。

注意如果两个实体之间存在cycylc引用,则必须使用@JsonBackReference注释(对于@ManyToOne注释字段)和@JsonManagedReference注释注释投影的相关方法(对于@OneToMany带注释的字段),否则JSON序列化中将存在JSON循环。

在每个@Repository注释(或@RepositoryRestResource注释)中,必须使用自定义投影将其标记为 excerptProjection 属性。

使用此管理,不需要任何其他配置,Lazy对象的异常最终消失。