2016-07-13 3 views
2

Я получаю следующее исключение с проектом Spring Data Rest:Spring Data Rest: Объект сериализации с объектом LAZY причиной JsonMappingException

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

Конечно, у меня есть некоторые объекты, которые имеют конфигурацию выборки = FetchType.LAZY ,

Я следил за многими инструкциями и ссылками, но у меня все еще есть это исключение.

То, что я уже пытался сделать (с NO effetcs):

  • добавить @EnableHypermediaSupport(type = HypermediaType.HAL) в классе конфигурации, которая простирается RepositoryRestMvcConfiguration

  • @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" fil тер в 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> 
    

Нет один из вышеупомянутые действия решили проблему!

Как решить эту проблему?

Спасибо.

ответ

4

Я нашел решение этой досадной проблемы.

Для каждого хранилища приложения Spring Data Rest необходимо определить пользовательский @Projection; в проекции появятся необходимые предметы.

Обратите внимание, что если есть cycylc ссылки между двумя объектами, то corrispective методы проекций должны быть аннотированный с @JsonBackReference аннотацию (для @ManyToOne аннотированных полей) и с @JsonManagedReference аннотацию (для @OneToMany аннотированных полей), в противном случае будет цикл JSON в сериализации JSON.

В каждых @Repository аннотаций (или @RepositoryRestResource аннотации) он должен быть отмечен excerptProjection свойства, с пользовательской проекцией.

С этим управлением нет необходимости в какой-либо другой конфигурации, и исключение для объектов Lazy наконец исчезнет.

Смежные вопросы