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;

Relaterade artiklar