当前位置: 首页 > 知识库问答 >
问题:

Spring MVC:无法反序列化启动外\u数组令牌的实例

方俊
2023-03-14

我已经有一段时间不高兴了。我是Spring的新手,真的需要一些帮助。

我试图使用SpringBoot从DB表返回代码列表。当我从浏览器中的URL调用我的REST控制器时。。。

示例URL: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。杰克逊。数据绑定。JsonMappingException:无法反序列化com实例。我的包装。存储库。开始数组令牌的查找选项

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

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

但是,现在我在Intellij中得到了一个错误。这表示Iterable需要一个“表达式”

谢谢你的时间和帮助艾德

谢谢你的回复。我选择了这个,现在一切似乎都起作用了。谢谢你的帮助!

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个答案

汝和裕
2023-03-14

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

这里有两个选项,要么使用数组(LookupChoice[]),要么将其转换为列表

restTemplate.getForObject(url, LookupChoice[]);

或者您可以使用参数化类型引用

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

不过,它是一个接口,所以要么对它进行子类化,要么使用匿名类,就像我在上面的代码示例中所做的那样。

另外,ParameterizedTypeReference仅在exchange()方法上有效(如果我没有弄错的话),因此您将获得一个ResponseEntity而不是原始对象,因此您必须使用getBody()方法。

 类似资料: