Я использую RepositoryRestMvcConfiguration
для тонкой настройки остальных поведения хранилища:RepositoryRestMvcConfiguration ObjectMapper vs. Spring Boot default ObjectMapper?
@Configuration
public class WebConfig extends RepositoryRestMvcConfiguration {
@Override
protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.setReturnBodyOnCreate(true);
}
Недостатком является расширенный класс приносит в своем собственном ObjectMapper боба, в результате чего conficts описано here. Рекомендуемым решением является использование расширяемого класса для маркировки компонента ObjectMapper как @Primary
, однако компонент из RepositoryRestMvcConfiguration
имеет различное поведение при сериализации вложенных объектов.
Давайте предположим, что следующие enitites:
@Entity class Parent {
@Id Long id;
@OneToMany @JsonManagedReference List<Child> children;
// usual getters and setters for fields...
}
@Entity class Child {
@Id Long id;
@ManyToOne @JsonBackReference Parent parent;
@ManyToOne @JsonBackReference School school;
public getSchooldId() { return school.getId(); }
// usual getters and setters for fields...
}
@Entity class School {
@Id Long id;
@OneToMany @JsonManagedReference List<Child> children;
// usual getters and setters for fields...
}
Использование по умолчанию Spring Загрузочный ObjectMapper дает ожидаемый результат (вложенные объекты визуализируются):
{"id": 1, "children":[{"id":2, "schoolId":7},{"id":3, "schooldId":8}]}
Однако ObjectMapper из RepositoryRestMvcConfiguration
игнорирует дочерние объекты :
{"id": 1}
Что такое правильный способ настройки объекта ObjectMapper RepositoryRestMvcConfiguration
для достижения того же поведения, что и Spring Boot default?
Это не поможет, к сожалению. 1) ObjectMapper также '@ Autowired' другим кодом Spring загрузки (например, конструктор в org.springframework.boot.actuate.autoconfigure.EndpointMBeanExportAutoConfiguration) 2) halObjectMapper может быть по умолчанию с помощью \t' @Override @Bean @Primary \t public ObjectMapper objectMapper() { \t \t return super.halObjectMapper(); \t} ' , но это дает тот же результат, что и другой объект. Маппер - вложенные объекты не отображаются в JSON. – Michal
Хорошо, теперь я понимаю вашу проблему. –
Это верно для конечных точек репозитория Spring Data Restore, но не для автономного использования ObjectMapper (например, для автоустройства в контроллере). Объект ObjectMapper по умолчанию (доступный путем autowiring, когда 'RepositoryRestMvcConfiguration' не расширен) отображает вложенные объекты как ожидаемые, даже без прогнозов. Как только я расширяю 'RepositoryRestMvcConfiguration' для целей конфигурации, objectMapper/halObjectMapper больше не создает вложенные объекты при использовании в автономном режиме. – Michal