【问题标题】:Passing of list of type Baseclass between Webservices involving generics and conversion of polymorphic types在涉及泛型和多态类型转换的 Web 服务之间传递类型基类列表
【发布时间】:2018-02-21 07:13:28
【问题描述】:

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

这两个服务共享一些模型。所有这些模型都是 'IDataToTransferred' 类型。

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

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

因此我写了一个使用参数的逻辑 List<? extends IDataToTransferred> 从 Sender 服务到 Receiver 服务。

更新:使用一些代码

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&lt;? extends IDataToTransferred&gt; 时。

当我在接收方将其更改为List&lt;? super IDataToTransferred&gt; 时,现在它可以工作了,我猜是因为生产者扩展了消费者超级规则。

但问题是现在我无法在接收方将类型转换为 IDataToTransferred 类型。在列表中我得到所有linkedHashmap,json被转换为这些服务之间的链接HashMap。

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

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

【问题讨论】:

  • 您希望得到哪个答案?您还没有发布任何代码。没有什么魔法可以解决一些解释不清楚的问题。
  • 当然。我将发布代码。虽然我使用@JsonSubTypes 得到了解决方案

标签: spring generics jackson resttemplate


【解决方案1】:

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

无论如何,我在 stackoverflow 页面 here 以及 this 博客中找到了答案。

示例带有抽象类。我用过接口。

如链接中所述。我在标记界面IDataToTransferred中引入了下面的注解:

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

type 属性作为属性引入到 beanDataToBeSent 中。该类型参数用作从接口类型转换为实现类型的信息。可以使用与名为“type”的变量不同的变量。在 JsonSubTypes annotation 中,我们提到了实现这个接口的类。

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
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2010-12-02
    • 2017-09-22
    • 2019-01-03
    • 2020-08-26
    相关资源
    最近更新 更多