我有两个使用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类对象?
为简单起见,我删除了控制器。假设它们与服务具有相同的签名。
答案 0 :(得分:0)
如果我知道更好的搜索条件,我会在发布之前找到答案。可惜。
无论如何,我在stackoverflow页面here和this博客中找到了答案。
示例是抽象类。我用过接口。
如链接中所述。我在标记界面 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
}
希望这有帮助。