我想从我的 angular 2 应用程序调用 java Api。我使用 typescript Map 在 java 应用程序中发送请求。
我在 java 中的 RestEndpoint 是这样的:
@PostMapping(value = Constants.PATH_BASE + "/sync/list")
public ResponseEntity<?>configureQueueList(@RequestBody Map<String,Integer> map){
//code here
}
当我尝试使用 typescript map 时出现此错误:
JSON parse error: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token\n at [Source: java.io.PushbackInputStream@f6b068c; line: 1, column: 1]
在 postman 中,我将其用作原始主体并且有效
{ "key1":"value1", "key2":"value2", ..... ..... }
编辑 2: 类型脚本端点
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);
}
最佳答案
请确保您的实际请求正文以 {
标记开头,而不是:[
。正如您所写,在 Postman 中,您使用 { }
包装您的请求,而错误消息:
[JSON parse error: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token;...
...来源:java.io.PushbackInputStream@f6b068c; 行:1,列: 1]
建议,您的实际请求用 [ ]
标签包裹
编辑(回答您的第一条评论):
将您的 Map
翻译成 Object
。例如,您可以使用此功能实现它:
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;
}
然后将转换结果提供到http.post
行
编辑 2 如果你使用的是 es6,上面的答案将有效,如果你使用的是 es5,你可以尝试使用像这样的字典
let map:{ [name: string]: number }={};
map["key1"]=value1;
map["key2"]=value2;
关于java - TypeScript 映射到 Java 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48168074/