我一直在反对这一段时间,但仍然没有快乐。我是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);
答案 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()
方法。