【问题标题】:Spring MVC: Can not deserialize instance of out of START_ARRAY tokenSpring MVC:无法反序列化超出 START_ARRAY 令牌的实例
【发布时间】:2016-07-18 19:35:10
【问题描述】:

我已经为此苦苦挣扎了一段时间,但仍然没有喜悦。我是 Spring 新手,真的可以使用一些帮助。

我正在尝试使用 Spring Boot 从数据库表中返回代码列表。当我从浏览器中的 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 令牌

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

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

但是,现在我在 Intellij 中遇到错误。它表示 IterableLookupChoice.class> 的“Expression expected” > 参数,我无法通过这个。

感谢您的时间和帮助, 埃德

感谢您的回复。我选择了这个,现在似乎一切正常。谢谢你的帮助!

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);

【问题讨论】:

  • 关于上述内容,是否有任何调整可以使其更优雅,和/或提高性能等?

标签: spring spring-mvc spring-boot


【解决方案1】:

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

这里有两个选择,或者使用数组 (LookupChoice[]) 并在必要时将其转换为 List&lt;LookupChoice&gt;

restTemplate.getForObject(url, LookupChoice[]);

或者你可以使用ParameterizedTypeReference:

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

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

另外,ParameterizedTypeReference 仅适用于 exchange() 方法,如果我没记错的话,所以你会得到一个 ResponseEntity 而不是你的原始对象,所以你必须使用 getBody()方法。

【讨论】:

    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2017-10-10
    • 2020-07-14
    • 1970-01-01
    • 2020-09-23
    相关资源
    最近更新 更多