2016-12-15 22 views
2

私は残りのリポジトリ行動の微調整のためにRepositoryRestMvcConfigurationを使用しています:RepositoryRestMvcConfigurationのObjectMapperとSpringBootのデフォルトのObjectMapperを比較しますか?

@Configuration 
public class WebConfig extends RepositoryRestMvcConfiguration { 
    @Override 
    protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { 
     config.setReturnBodyOnCreate(true); 
} 

欠点は、拡張されたクラスはconfictsがhereを説明引き起こし、独自のObjectMapper豆にもたらしています。推奨される回避策は、拡張クラスを使用してObjectMapper Beanを@Primaryとマークすることですが、RepositoryRestMvcConfigurationのBeanはネストしたエンティティを直列化している間に異なる動作をします。

のは、以下のenitites仮定しましょう:春ブーツObjectMapperが期待される結果を与えるデフォルトを使用して

@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... 
} 

を(ネストされた実体がレンダリングされます):

{"id": 1, "children":[{"id":2, "schoolId":7},{"id":3, "schooldId":8}]} 

RepositoryRestMvcConfigurationからObjectMapperが子実体を無視しかし、 :

{"id": 1} 

RepositoryRestMvcConfiguration ObjectMapperをSpring Bootのデフォルトと同じ動作に設定する正しい方法はありますか?

答えて

0

RepositoryRestMvcConfigurationは、2つのobjectMapperオブジェクトを作成します。

  1. 内部フレームワーク用のobjectMapperです。
  2. コレクションのレンダリングを担当するhalObjectMapper Resourcesおよびリンク。

あなたは修飾子を使用してobjectMapperをオートワイヤリングにより、所望の結果を達成するために試みることができる:

@Qualifier('_halObjectMapper') 

はEDIT:/ネストされたプロパティを関連付けをレンダリングするための

春データ-残りはレンダリングされません。既定のアソシエーション(reference)は、HATEOAS仕様(ご使用のjsonの_link部分)の下で使用できるためです。 アソシエーションをレンダリングしたい場合は、投影を使用するだけです。

この人はいくつかの属性があります。

{ 
    "firstName" : "Frodo", 
    "lastName" : "Baggins", 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:8080/persons/1" 
    }, 
    "address" : { 
     "href" : "http://localhost:8080/persons/1/address" 
    } 
    } 
    } 
:idは、姓と名のデータ属性の主キーですが、アドレスは

@Entity 
public class Person { 

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

    @OneToOne 
    private Address address; 
    … 
} 

がレンダリングされる別のドメインオブジェクトへのリンクです

デフォルトでは、Spring Data RESTは、すべての属性を含むこのドメインオブジェクトをエクスポートします。 firstNameとlastNameは、そのままのデータオブジェクトとしてエクスポートされます。アドレス属性には2つのオプションがあります。 1つのオプションは、Addressのリポジトリも定義することです。

別のルートがあります。Addressドメインオブジェクトに独自のリポジトリ定義がない場合、SpringデータRESTはPersonリソース内のデータフィールドをインライン展開します。

+0

これは残念なことに、役に立たない。 objectMapperは、例えば、他のスプリングブートコードによってAutowired'(org.springframework.boot.actuate.autoconfigure.EndpointMBeanExportAutoConfigurationにおけるコンストラクタ)@ 2)halObjectMapperは \t '@Override @Beanを使用してデフォルトにすることができる'も 1) @Primary \t public ObjectMapper objectMapper(){ \t \t return super.halObjectMapper(); \t} ' でも、他のオブジェクトと同じ結果が得られます。マッパーネストされたエンティティはJSONにレンダリングされません – Michal

+0

これで問題は分かりました。 –

+0

これは、Spring Data Restリポジトリのエンドポイントでは有効ですが、スタンドアロンのObjectMapper(コントローラで自動実行など)では使用できません。デフォルトのObjectMapper( 'RepositoryRestMvcConfiguration'が拡張されていないときにautowiringによって利用可能)は、投影さえなくてもネストされたエンティティを期待どおりにレンダリングします。 設定目的で 'RepositoryRestMvcConfiguration'を拡張するとすぐに、objectMapper/halObjectMapperはスタンドアロンモードで使用されたときにネストされたエンティティをレンダリングしなくなりました。 – Michal

関連する問題