2017-09-12 11 views
0

2つの異なるサーバー上で実行されるSpringブートを使用する2つのRESTサービスがあります。この通信にはRESTテンプレートを使用しています。ジェネリック型と多型の変換を含むWebサービス間の型のリストの受け渡し

これらの2つのサービスで共有されるモデルもあります。これらのモデルはすべて「IDataToTransferred」タイプです。

'IDataToTransferred'は、さまざまなモデルBeanによって実装されたマーカーインターフェイスです。

これらのRESTサービス間でこれらのモデルのリストを渡すための共通のロジックを記述する必要があります。

したがって、SenderサービスからReceiver Serviceまでのパラメータ List<? extends IDataToTransferred>を使用するロジックを作成しました。

更新:いくつかのコード

でIDataToTransferred.javaは、マーカーインターフェイスです

DataToBeSent.java

DataToBeSent Implements IDataToTransferred{ 
    //Simple Pojo 
} 

SenderService.java

sendData(List<? extends IDataToTransferred> uploadDataObjectList){ 
//Some Code with REST Template 
//restTemplate.postForEntity 
} 

IDataToTransferredインターフェイスは、通信するWebサービス間で共有されます。

DataToBeReceived.java

DataToBeReceived Implements IDataToTransferred{ 
//Simple Pojo 
} 

ReceiverService.java RESTサービスで

receiveData(List<? extends IDataToTransferred> uploadDataObjectList){ 
//Some Code to convert uploadDataObjectList to DataToBeReceived 
} 

ノートは、私は常に415エラーを取得しました。サポートされていないメディアの種類。 Receiverで同じList<? extends IDataToTransferred>を使用すると

Receiver側でこれをList<? super IDataToTransferred>に変更しましたが、現在は動作していますが、Producerがコンシューマースーパールールを拡張しているため推測しています。

しかし問題は、Receiver SideのIDataToTransferredタイプに型キャストできないということです。リストの中で私はすべてのリンクされたハッシュマップを取得しています.Jsonはこれらのサービスの間でリンクされたHashMapに変換されています。

ReceiverServiceでDataToBeReceivedクラスオブジェクトを取得するにはどうすればよいですか?

簡単にするために、私はコントローラを削除しました。彼らはサービスと同じ署名を持っていると仮定してください。

+0

どの回答がお望みですか?あなたはコード行を投稿していません。不明確な説明から問題を解決できる魔法はありません。 – StanislavL

+0

私はコードを掲載します。 @JsonSubTypesを使った解決策がありましたが – DragonZoned

答えて

0

私が検索する用語が分かっていれば、投稿前に回答を見つけたでしょう。しかし悲しいかな。

いずれにしても、私はstackoverflowページhereで答えを見つけました。this ofcourseのブログです。

例は抽象クラスです。私はインターフェイスで使用しました。

リンクに記載されているとおりです。私はIDataToTransferredマーカーインタフェースに注釈下に導入:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
@JsonSubTypes({ 
@Type(value = DataToBeSent.class, name = "datatransfer")}) 

タイプをプロパティとしてビーンDataToBeSentに導入されます。この型パラメータは、インタフェース型から実装型に変換するための情報として使用されます。 "タイプ"という名前の変数とは異なる変数を使用できます。 JsonSubTypesアノテーションでは、このインタフェースを実装しているクラスについて説明します。

DataToBeSent Implements IDataToTransferred{ 
//Simple Pojo 
// Some Properties with getter and setter 
    String type = "datatransfer"; 
//with getter and setter 
} 

受信側でも同じ演習を実装する必要があります。そこで、私たちは以下のように注釈を持つことになります。

ここ
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
@JsonSubTypes({ 
@Type(value = DataToBeReceived.class, name = "datatransfer")}) 

を、我々はIDataToTransferredインタフェースを実装するように、クラスをDataToBeReceivedています。

DataToBeReceived Implements IDataToTransferred{ 
//Simple Pojo 
// Some Properties with getter and setter 
    String type = "datatransfer"; 
//with getter and setter 
} 

・ホープ、このことができます:ofcourseのあなたはまた、次のようにDataToBeReceivedクラスにプロパティとしてタイプを追加する必要があります。

関連する問題