2017-11-15 9 views
0

MongoDBでのSpringデータの使用。コンストラクタ引数とスプリングデータのデシリアライゼーションの問題

問題は、コンストラクタに実際にネストされたオブジェクトの内部にある引数があるため、Mongoから取得したBeanをインスタンス化することです。持続性は問題ではありません。検索はIsです。

クラス構造は以下のようになります。ここで、BはAの内側にネストされます。Aは、そのコンストラクタParamsの1つを使用してBをインスタンス化します。内部にネストされ

クラスA

Class A{ 
int prop1; 
B b; 

@JsonCreator 
public A( @JsonProperty int prop1, @JsonProperty int prop2){ 
    this.prop1 = prop1; 
    this.b = new B(prop2); 
} 
} 

クラスBオブジェクトは、以下のJSON形式でREST APIによって受信される

Class B(){ 
int prop2; 

@JsonCreator 
public B(@JsonProperty int prop2){ 
    this.prop2 = prop2; 
} 
} 

{"prop1":"Hello1","prop2":"Hello2"} 

スプリングコントローラが受信しますそれをObject Aに正しくマップします。Springはデフォルトで引数なしのコンストラクタを使用するので、私はjsoncreatorを使ってarg-constructorの表記法であり、MongoDBに追加されています。

データは、適切なBean構造ごとに以下の形式で格納されます。

問題:Mongoから取得しようとするとエラーが発生します。それは言う:

org.springframework.data.mapping.model.MappingException: No property prop2 
found on entity class A to bind constructor parameter to 

私はSpringDataからSpringDataを取得するときにprop2を含むオブジェクトBを使用するようにSpringDataに指示できますか?

public A(int prop1, B b){ 
     ...... 
     ...... 
    } 

が1つの以上のコンストラクタを追加するObjectMapperで動作します:

私は多分、私は以下のようなコンストラクタの引数の1つとして、オブジェクトBを使用してトリックを、行いますもう一つのコンストラクタを追加する考えは(おそらく可能ではないthatsの) SpringDataでは再びそうではありません。

新しい例外がスローされます。この時間は:

 org.springframework.data.mapping.model.MappingInstantiationException: 
     Failed to instantiate A using constructor NO_CONSTRUCTOR with 
     arguments. 

私はリスト/使用されていない使用されている上記のエラーをチェックしますが、私は両方の方法とdidntの決意を試してみました。

注:オブジェクトBは他の多くのBeanで使用される共通のプロパティを含んでいるためネストされています(抽象クラ​​スでも可能ですが、後で試してみる必要がありますが、

SpringDataはオブジェクトAをどのように作成しますか?

答えて

0

faux pasのように見えます。

検索にはより良い用語を使用する必要があります。正解を見つけたでしょうか。誰かがこの問題に直面した場合に備えて...

いくつかの検索は、この下の質問に私を導いた:

How exactly does spring-data-mongodb handle constructors when rehydrating objects?

上記の質問は、私に解決策を与えたいくつかのことを言及しています。答えは、SpringDataからBeanへの逆シリアル化に別のコンストラクタを使用することにあります。私はこの注釈、検索作品で第二のコンストラクタを使用している場合は、問題の例では

@PersistenceConstructor 

:このコンストラクタは、と注釈される必要があります。

 @PersistenceConstructor 
     public A(int prop1, B b){ 
     ...... 
     ...... 
     } 

はだから今、私は2つのコンストラクタ、@jsoncreatorと1と@PersistenceConstructorと別のものを持っています。しかし、この他のコンストラクタは、SpringDataからの取得以外に他の用途がない場合でもプライベートにすることができ、ビジネスロジックをそのまま残しておくことでコードに使用されることはありません。 したがって、以下も機能します:

 @PersistenceConstructor 
     private A(int prop1, B b){ 
     ...... 
     ...... 
     } 
関連する問題