求助!!Spring boot 的 RestTemplate把Response对象被转成LinkedHashMap

Shiitou 2018-01-27 01:19:34
用spring boot 做了两个APi,两个APi之间的调用使用了RestTemplate的postForObject方法,返回类型是自定义的ApiResponse。

被调用的A api Controller

@Controller
public class TestController {
@RequestMapping(value = "invocationMethod", method = RequestMethod.POST)
public ApiResponse getContracts(@PathVariable Integer id) {
ResultModel model = new ResultModel();
TestObject object = new TestObject();
object.setFild1("fild1");
object.setFild2("fild2");
model.setId("1");
model.setName("testName");
model.setObject(object);
return ApiResponse.success(model);
}
}


返回类型 ApiResponse

public class ApiResponse {

// return code 200:OK
private Integer statusCode;

// whole message
private String message;

// The component of data
private Object responseData;



private ApiResponse(ResultStatus status) {
this.statusCode = status.code();
this.message = status.reason();
}

public static ApiResponse success(Object responseData) {
ApiResponse response = new ApiResponse(ResultStatus.SUCCESS);
return response.setResponseData(responseData);
}

}


返回结果ResultModel

public class ResultModel {

private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public TestObject getObject() {
return object;
}

public void setObject(TestObject object) {
this.object = object;
}

private String name;

private TestObject object;

}


TestObject对象

public class TestObject {

private String fild1;

private String fild2;

public String getFild1() {
return fild1;
}

public void setFild1(String fild1) {
this.fild1 = fild1;
}

public String getFild2() {
return fild2;
}

public void setFild2(String fild2) {
this.fild2 = fild2;
}

}


B Api的 Model和A api的Model完全一样。

B Api 调 A Api

public class TestService {

@Autowired
private RestTemplate restTemplate;

public ApiResponse callAapi() {

ApiResponse response =
restTemplate.postForObject("http://localhost:9000/invocationMethod", "",
ApiResponse.class);
return response;
}
}


当把ApiResponse的ResponseData转成ResultModel的,出错了

public ResultModel getResultModel(ApiResponse response) {
return (ResultModel) response.getResponseData();
}


报的错是LinkedHashMap不能转换成ResultModel。

想请问一下,A Api的response实际是一个json的字符串,通过postForObject转成了Bean的实体类,为什么response中的ResponseData不能转成Bean,而是被转成了linkedHashMap?
调查了很久,没找到原因,希望坛子里的大神们,如有看到此贴,麻烦发表下看法,谢谢!!!!


...全文
6019 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
863922230 2020-11-10
  • 打赏
  • 举报
回复
直接用feign调用多好啊,那样没有啥问题的。
Lingo852 2020-11-09
  • 打赏
  • 举报
回复 1
首先你要知道 序列化与 反序列化 是怎样的 RestTemplate 其实就是一个发起HTTP请求的客户端(相当于 前端),它得到的也是 json 字符串,然后 postForObject 里面会 反序列化 为 你要的 ApiResponse ,但是问题就在于 ApiResponse 中 responseData 是Object 类型(你让jvm怎么装配数据,肯定就给个通用的给你啊),在java中Object 可以代表一切数据,json 在后端中跟 一个 Map 的数据结构差不多,因此 在ApiResponse responseData 中,他就是一个 map——至于是 LinkedHashMap 应该是springboot 默认反序列化器的问题。 因为 responseData 是一个 LinkedHashMap ,你强转成 ResultModel 当然就会报错! 如果你想 getResultModel(ApiResponse response) 返回 ResultModel  对象,可以用 fastJson 的 JsonObject.toJavaObject() 方法
aaaak_ 2020-11-04
  • 打赏
  • 举报
回复
ParameterizedTypeReference<List<MyModelClass>> typeRef = new ParameterizedTypeReference<List<MyModelClass>>() {
};
ResponseEntity<List<MyModelClass>> responseEntity = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(mvm), typeRef);
List<MyModelClass> myModelClasses = responseEntity.getBody();
多加个 ParameterizedTypeReference 指定类型
Sunyiban 2018-01-31
  • 打赏
  • 举报
回复
这个应该要去翻源码~

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧