Spring MVC:无法反序列化START_ARRAY令牌的实例

时间:2016-07-18 19:35:10

标签: spring spring-mvc spring-boot

我一直在反对这一段时间,但仍然没有快乐。我是Spring的新手,可以真正使用一些帮助。

我正在尝试使用Spring Boot从DB表中返回代码列表。当我从浏览器中的URL调用我的REST控制器时......

示例网址: localhost:8081 / cis / utl / lookupchoice / O.s /

它返回:

[
{"lookupId":10,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Pending","hidden":false,"displayOrder":1},
{"lookupId":11,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Active","hidden":false,"displayOrder":2},
{"lookupId":12,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Archived","hidden":false,"displayOrder":3},
{"lookupId":13,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Placeholder","hidden":false,"displayOrder":4}
]

但是,尝试从客户端控制器运行时收到错误消息。电话看起来像这样:

//
//Compiles but does not work
LookupChoice lookupChoice = restTemplate.getForObject(REST_URI+"/utl/lookupchoice/O.s/",
         LookupChoice.class);

错误: 嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:无法将com.MyPakage.repository.LookupChoice的实例反序列化为START_ARRAY令牌 < / p>

假设因为返回数组而不是单个对象而发生错误,我将代码更改为:

//
//Does not compile
Iterable<LookupChoice> lookupChoice = restTemplate.getForObject(REST_URI+"/utl/lookupchoice/U.r/",
         Iterable<LookupChoice.class>);

但是,现在我在Intellij中遇到错误。它表示 Iterable &lt; LookupChoice.class&gt; strong> param,我无法超越这个。

感谢您的时间和帮助, 编

感谢您的回复。我选择了这一切,现在似乎都有效。谢谢你的帮助!

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Object[]> responseEntity;
Object[] lookupChoice;

responseEntity = restTemplate.getForEntity(REST_SERVICE_URI+"/utl/lookupchoice/O.s/" , Object[].class);
lookupChoice = responseEntity.getBody();
model.addAttribute("Status", lookupChoice);

1 个答案:

答案 0 :(得分:3)

它没有编译的原因是因为它在Java中不可能传递一类泛型类型参数,因为它们不会在运行时存在。

这里有两个选项,使用数组(LookupChoice[])并在必要时将其转换为List<LookupChoice>

restTemplate.getForObject(url, LookupChoice[]);

或者您可以使用ParameterizedTypeReference

restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<LookupChoice>>() {}).getBody()

它是一个接口,所以要么是它的子类,要么像我在上面的代码示例中那样使用匿名类。

此外,ParameterizedTypeReference仅适用于exchange()方法,如果我没有弄错的话,那么您将获得ResponseEntity而不是原始对象,所以您必须使用getBody()方法。