2016-07-05 2 views
0

Я использую конфигурацию по умолчанию для загрузки весны. Мой простой проект корректно работает с типом загрузки Eager в сопоставлениях отношений. Если я попытаюсь применить Lazy loading в OneToMany или ManyToMany отношение, я получаю проблему, чем.Параметры загрузки Spring Boot JPA по умолчанию и @JsonManagedReference @JsonBackReference

Они говорят проблема может быть решена, если использовать специальные аннотации к

// to mark class field 
@JsonManagedReference 
@JsonBackReference 
// to mark class 
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 

Но это не работает из-за других проблем

Hibernate: select projectinf0_.id as id1_4_, projectinf0_.description as descript2_4_, projectinf0_.name as name3_4_ from project_info projectinf0_ 
2016-07-05 22:32:45 [http-nio-8080-exec-1]     WARN o.s.w.s.m.s.DefaultHandlerExceptionResolver.handleHttpMessageNotWritable(400) - Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: failed to lazily initialize a collection of role: com.vl.pmanager.domain.model.ProjectInfo.tags, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.vl.pmanager.domain.model.ProjectInfo["tags"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.vl.pmanager.domain.model.ProjectInfo.tags, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.vl.pmanager.domain.model.ProjectInfo["tags"]) 

Я вижу, я должен исправить не удалось лениво инициализировать коллекция роли. Если я должен сделать что-то с ролями весны безопасности, у меня есть эта часть в моей конфигурации

@Configuration 
static class SecurityConfig extends GlobalAuthenticationConfigurerAdapter { 

    @Override 
    public void init(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication() 
       .withUser("user").password("user").roles("USER").and() 
       .withUser("hero").password("hero").roles("USER", "HERO"); 
    } 
} 

так я не могу понять, какую роль коллекции я должен инициализировать в случае, если я не имею относительные сущности к моим поврежденным объектам ,

+0

Убедитесь, что у вас есть ** spring.jpa.open-in-view ** как true в application.properties. Это именно то поведение, которое вы увидите, если оно ложно (по умолчанию должно быть истинно) – jp86

+0

i установить ** spring.jpa.open-in-view ** на false. И я считаю, что это поведение может быть, если нет json-аннотаций. Но я добавил – Sergii

ответ

1

Я считаю, что проблема заключается в сериализации. Джексон не знает, где остановиться. Например: если у Группы есть учетная запись и учетная запись имеет группу (manyToMany), она продолжает сериализоваться в цикле. @JsonManagedReference, @JsonBackReference или @JsonIdentityInfo могут выполнять работу, но только с в одном направлении. Что я могу предложить, это посмотреть на Весна-данные-отдых, а также Hateoas. Он намного чище и поддерживает двунаправленную.

+0

Мне не нужно управлять ** Hateoas **. Json должен управлять ленивой загрузкой. Если ленивый не был загружен, сбор должен быть пустым или пустым. Если относительная коллекция уже загружена, она должна отображаться в json. Аннотации предоставляют решение не только для цикла, но и для _lazy problem_ – Sergii