2016-07-18 5 views
2

Ich habe meinen Kopf schon eine Weile gegen diesen Punkt geschlagen und immer noch keine Freude. Ich bin neu in Spring und könnte wirklich Hilfe gebrauchen.Spring MVC: Instanz von START_ARRAY-Token kann nicht deserialisiert werden

Ich versuche Spring Boot zu verwenden, um eine Liste von Codes aus einer DB-Tabelle zurückzugeben. Wenn ich rufe meinen REST-Controller von einer URL in einem Browser ...

Beispiel URL: localhost: 8081/cis/UTL/lookupchoice/O/

Es gibt diesen:

[ 
{"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} 
] 

Aber ich erhalte eine Fehlermeldung, wenn ich versuche, dies von einem Client-Controller aus auszuführen. Der Aufruf sieht wie folgt aus:

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

Der Fehler:verschachtelte Ausnahme ist com.fasterxml.jackson.databind.JsonMappingException: Kann nicht deserialisieren Instanz com.MyPakage.repository.LookupChoice aus START_ARRAY Token

den Fehler Unter der Annahme, tritt auf, weil ein Array anstelle eines einzelnen Objekts zurückgegeben wird, änderte ich den Code dazu:

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

Aber jetzt ich ge t ein Fehler in Intellij. Es wird darauf hinweist, dass eine "Expression erwartet" für die Iterable < LookupChoice.class> param, und ich kann nicht in der Vergangenheit diese.

Vielen Dank für Ihre Zeit und Unterstützung, Ed

Vielen Dank für Ihre Antwort. Ich habe mich dafür entschieden und alles scheint jetzt zu funktionieren. Danke für Ihre Hilfe!

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

Über die oben genannten, gibt es irgendwelche Verbesserungen, die dies eleganter machen, und/oder Leistung usw. verbessern? – eLowe

Antwort

3

Der Grund ist es nicht kompiliert ist, weil es in Java unmöglich ist, eine Klasse von generischen Typ Parameter zu übergeben, weil sie während der Laufzeit nicht vorhanden sind.

Sie haben zwei Möglichkeiten, entweder ein Array verwenden (LookupChoice[]) und wandelt es in ein List<LookupChoice> falls erforderlich:

restTemplate.getForObject(url, LookupChoice[]); 

Oder Sie können die ParameterizedTypeReference verwenden:

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

Es ist ein Interface, so entweder Unterklasse oder verwenden Sie eine anonyme Klasse wie ich im obigen Codebeispiel.

Auch ParameterizedTypeReference funktioniert nur auf der exchange() Methode, wenn ich nicht alles täusche, so dass Sie ein ResponseEntity anstelle Ihrem rohen Objekt erhalten, so dass Sie die getBody() Methode verwenden müssen.

Verwandte Themen