在涉及泛型的Web服务和多态类型的转换之间传递类型Baseclass的列表

时间:2017-09-12 18:06:17

标签: spring generics jackson resttemplate

我有两个使用Spring Boot在两个不同服务器上运行的REST服务。我正在使用REST模板进行此通信。

这两种服务共享一些模型。所有这些模型都是“IDataToTransferred”类型。

'IDataToTransferred'是由各种Model Beans实现的标记接口。

我需要编写一个通用逻辑,用于在这些REST服务之间传递这些模型的列表。

因此我编写了一个使用参数的逻辑     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 接口在通信网络服务之间共享。

DataToBeReceived.java

DataToBeReceived Implements IDataToTransferred{
//Simple Pojo
}

ReceiverService.java

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

注意在REST服务中,我总是得到415错误。不支持的媒体类型。当我在Receiver上使用相同的List<? extends IDataToTransferred>时。

当我在Receiver端将其更改为List<? super IDataToTransferred>时,现在它可以工作,我猜是因为Producer扩展了Consumer超级规则。

但问题是现在我无法对Receiver Side上的IDataToTransferred类型进行类型转换。在列表中我得到了所有的LinkedHashmap,json被转换为这些服务之间的链接HashMap。

如何在ReceiverService中获取DataToBeReceived类对象?

为简单起见,我删除了控制器。假设它们与服务具有相同的签名。

1 个答案:

答案 0 :(得分:0)

如果我知道更好的搜索条件,我会在发布之前找到答案。可惜。

无论如何,我在stackoverflow页面herethis博客中找到了答案。

示例是抽象类。我用过接口。

如链接中所述。我在标记界面 IDataToTransferred

中引入了以下注释
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
@JsonSubTypes({
@Type(value = DataToBeSent.class, name = "datatransfer")})

属性 type 在bean DataToBeSent 中作为属性引入。此类型参数用作从接口类型转换为实现类型的信息。可以使用与名为“ type ”的变量不同的变量。在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")})

在这里,我们将DataToBeReceived类作为实现 IDataToTransferred 接口。当然,您需要将类型作为属性添加到 DataToBeReceived 类,如下所示:

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

希望这有帮助。