我正在尝试返回ResponseEntity
列表并将该响应强制转换为我的模型类。
例如:如果我使用ResponseEntity<List<ApplicationModel>>
它运行良好但我不想为每个模型编写响应方法。
ResponseEntity
方法
public static <T> ResponseEntity<List<T>> getResponseList(String resourceURL) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
HttpEntity<List<T>> entity = new HttpEntity<List<T>>(headers);
ResponseEntity<List<T>> response = restTemplate.exchange(resourceURL, HttpMethod.GET, entity,
new ParameterizedTypeReference<List<T>>() {
}, Collections.emptyMap());
return response;
}
方法调用
private final String url ="http://localhost:8090/xxx/application";
ResponseEntity<List<ApplicationModel> responseForApplications =
ResponseTemplate.getResponseList(url);
if (responseForApplications.getStatusCode() == HttpStatus.OK)
List<ApplicationModel> dtoApplications = responseForApplications.getBody();
我想要投射的JSON响应示例
{ “ID”:1, “名称”: “foo” 的, “说明”: “foo” 的}
错误
出现意外错误(type = Internal Server Error,status = 500)。 创建名为'index'的bean时出错:init方法的调用失败;嵌套异常是java.lang.ClassCastException:java.util.LinkedHashMap无法强制转换为com.xxx.ApplicationModel
答案 0 :(得分:1)
这个问题来自杰克逊。当它没有足够的时候 有关要反序列化的类的信息,它使用LinkedHashMap。
由于您未通知杰克逊您的元素类型 在ArrayList中,它不知道你想要反序列化为 ApplicationModels 的ArrayList。所以它回归到默认值。
相反,您可以使用as(JsonNode.class),然后处理 ObjectMapper以比放心的方式更丰富的方式允许。
有关其他信息,请参阅java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.testing.models.Account。
答案 1 :(得分:0)
使用mapper.convertValue
对我有用。
ObjectMapper mapper = new ObjectMapper();
List<ApplicationModel> dtoApplications = mapper.convertValue(responseForApproles.getBody(), new TypeReference<List<ApplicationModel>>() {});