angular - TypeScript Map till Java Map
Jag vill anropa Java API från min Angular 2-app. Jag använde TypeScript Map för att skicka begäran till Java-appen.
Min RestEndpoint i Java ser ut så här:
@PostMapping(value = Constants.PATH_BASE + "/sync/list")
public ResponseEntity<?>configureQueueList(@RequestBody Map<String,Integer> map){
//code here
}
Jag fick detta fel när jag försökte använda TypeScript map:
JSON-parserfel: Kan inte deserialisera instans av java.util.LinkedHashMap från START_ARRAY-token; inbäddat undantag är com.fasterxml.jackson.databind.JsonMappingException: Kan inte deserialisera instans av java.util.LinkedHashMap från START_ARRAY-token\n vid [Källa: java.io.PushbackInputStream@f6b068c; rad: 1, kolumn: 1]
I Postman använder jag detta som rå kropp och det fungerar
{ "key1":"value1", "key2":"value2", ..... ..... }
Redigera 2: Type Script-ändpunkt
postMap(value:Map<string,number>){
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
return this.http.post(this.url, value, options)
.map(success => success.status)
.catch(this.handleError);
}
Svar #1
Se till att din faktiska begäran börjar med {-taggen, inte: [. Som du har skrivit, i Postman omsluter du din begäran med { }, medan felmeddelandet:
[JSON-analysfel: Kan inte deserialisera instans av java.util.LinkedHashMap från START_ARRAY token;...
...Källa: java.io.PushbackInputStream@f6b068c; rad: 1, kolumn: 1]
föreslår att din faktiska begäran är innesluten med [ ]-taggar
REDIGERA (för att svara på din första kommentar): Översätt din Map till Object. Till exempel kan du göra det med denna funktion:
function mapToObj(strMap) {
let obj = Object.create(null);
for (let [k,v] of strMap) {
obj[k] = v; //look out! Key must be a string!
}
return obj;
}
Ge sedan resultatet av din transformation till http.post-raden
Redigera 2 Svaret ovan kommer att fungera om du använder es6, om du använder es5 kan du försöka använda ett lexikon som detta
let map:{ [name: string]: number }={};
map["key1"]=value1;
map["key2"]=value2;
