Я изучаю Spring Boot, и на самом деле я пытаюсь получить загруженные ленивые ассоциации именно тогда, когда это необходимо, и не включает Json, сгенерированный во время рендеринга страницы.
У меня есть класс Person, у которого естьавтоассоциация "папа":
@Entity(name = "Person")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long idPerson;
private String Name;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "idFather")
private Person father;
/*Getters and setters ommited*/
}
Я настроил объект сопоставления с Джексоном, как это предлагается на этом сайте :
@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
return new Jackson2ObjectMapperBuilder()
.modulesToInstall(Hibernate5Module.class);
}
Наконец, у меня есть GETконечная точка, которая будет возвращать одного человека, если идентификатор сообщен или перечислить всех в противном случае.Мой PersonRepository simple расширяет интерфейс CrudRepository.
Когда я пытаюсь получить одну запись, отец загружается не так, как ожидалось:
//localhost:9000/person/2
{"idPerson":2,"name":"Luke Skywalker","father":null}
Но если я пытаюсь получить всех людей (CrudRepository.listAll) ассоциации извлекаются:
//localhost:9000/person
[
{
"idPerson":1,
"name":"Darth Vader",
"father":null
},
{
"idPerson":2,
"name":"Luke Skywalker",
"father":{
"idPerson":1,
"name":"Darth Vader",
"father":null
}
}
]
Я не желаю этого поведения, и мне, вероятно, не хватает некоторой конфигурации в Object Mapper.
Кто-нибудь имеет представление о том, что мне следует делать?
Редактировать:
Не думаю, что это дублирование Избегайте Джексонасериализация на не извлеченных ленивых объектах .
Первый: ответ при наличии старого и WebMvcConfigurerAdapter устарел в Hibernate 5.
Второй: на основе Настройте Джексона, чтобы он не использовал атрибуты отложенной загрузки в Spring Boot .Я подозреваю, что решение, предоставленное @ r1ckr по первой теме, фактически эквивалентно тому, что я использую:
@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
return new Jackson2ObjectMapperBuilder()
.modulesToInstall(Hibernate5Module.class);
}
Третье: даже зная об устаревании, я попробовал предложенное решение с тем же поведением, которое усиливало вторуюточка.
Четвертый: я попробовал тот же подход, используя реальный интерфейс WebMvcConfigurer, и снова добился того же поведения.
@Configuration
@EnableWebMvc
public class Configuration implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(jacksonMessageConverter());
WebMvcConfigurer.super.configureMessageConverters(converters);
}
public MappingJackson2HttpMessageConverter jacksonMessageConverter() {
MappingJackson2HttpMessageConverter messageConverter =
new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Hibernate5Module());
messageConverter.setObjectMapper(mapper);
return messageConverter;
}
}