2016-12-15 5 views
2

Я использую 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?

ответ

0

RepositoryRestMvcConfiguration создает два объекта objectMapper.

  1. объектMapper для внутреннего использования рамки.
  2. halObjectMapper, ответственный за получение коллекции Resources и ссылки.

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

@Qualifier('_halObjectMapper') 

EDIT: Для оказания ассоциации/вложенными Свойства

Spring дата-остальное не оказывает по умолчанию ассоциации (reference), потому что они доступны в соответствии со спецификацией HATEOAS (часть вашего json) _link. Если вы хотите сделать ассоциации, вам просто нужно использовать Прогнозы.

Это лицо имеет несколько атрибутов: идентификатор первичный ключ, ПгвЬЫате и LastName атрибуты данных, адрес ссылку на другой объект домена

@Entity 
public class Person { 

    @Id @GeneratedValue 
    private Long id; 
    private String firstName, lastName; 

    @OneToOne 
    private Address address; 
    … 
} 

Будет оказана:

{ 
    "firstName" : "Frodo", 
    "lastName" : "Baggins", 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:8080/persons/1" 
    }, 
    "address" : { 
     "href" : "http://localhost:8080/persons/1/address" 
    } 
    } 
    } 

По умолчанию Spring Data REST экспортирует этот объект домена, включая все его атрибуты. firstName и lastName будут экспортироваться как обычные объекты данных, которые они представляют. Существует два варианта атрибута адреса. Один из вариантов - также определить репозиторий для адреса.

Существует еще один маршрут.Если объект Address domain не имеет собственного определения репозитория, Spring REST будет вставлять поля данных прямо в ресурс Person.

+0

Это не поможет, к сожалению. 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

+0

Хорошо, теперь я понимаю вашу проблему. –

+0

Это верно для конечных точек репозитория Spring Data Restore, но не для автономного использования ObjectMapper (например, для автоустройства в контроллере). Объект ObjectMapper по умолчанию (доступный путем autowiring, когда 'RepositoryRestMvcConfiguration' не расширен) отображает вложенные объекты как ожидаемые, даже без прогнозов. Как только я расширяю 'RepositoryRestMvcConfiguration' для целей конфигурации, objectMapper/halObjectMapper больше не создает вложенные объекты при использовании в автономном режиме. – Michal

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

  • Нет связанных вопросов^_^