此控制器
@GetMapping("temp")
public String temp(@RequestParam(value = "foo") int foo,
@RequestParam(value = "bar") Map<String, String> bar) {
return "Hello";
}
产生以下错误:
{
"exception": "org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException",
"message": "Failed to convert value of type 'java.lang.String' to required type 'java.util.Map'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.Map': no matching editors or conversion strategy found"
}
我想要的是传递一些带有bar
参数的JSON:
foo
,7
为bar
且{"a":"b"}
为@RequestBody
为什么Spring无法进行这种简单的转换?请注意,如果地图用作POST
请求的{{1}},则无效。
答案 0 :(得分:4)
以下是有效的解决方案:
只需将String
到Map
的自定义转换为@Component
。然后它会自动注册:
@Component
public class StringToMapConverter implements Converter<String, Map<String, String>> {
@Override
public Map<String, Object> convert(String source) {
try {
return new ObjectMapper().readValue(source, new TypeReference<Map<String, String>>() {});
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
}
}
答案 1 :(得分:3)
如果您想使用Map<String, String>
,您必须执行以下操作:
@GetMapping("temp")
public String temp(@RequestParam Map<String, String> blah) {
System.out.println(blah.get("a"));
return "Hello";
}
此网址为:http://localhost:8080/temp?a=b
使用Map<String, String>
,您可以访问所有提供的网址请求参数,以便添加?c=d
并使用blah.get("c");
如需了解更多信息,请参阅:{{3>} 将地图与@RequestParam用于多个参数
更新1:如果您想将JSON作为String传递,可以尝试以下方法:
如果要映射JSON,则需要定义相应的Java对象,因此对于您的示例,请使用实体进行尝试:
public class YourObject {
private String a;
// getter, setter and NoArgsConstructor
}
然后使用Jackson的ObjectMapper
将JSON字符串映射到Java实体:
@GetMapping("temp")
public String temp(@RequestParam Map<String, String> blah) {
YourObject yourObject =
new ObjectMapper().readValue(blah.get("bar"),
YourObject.class);
return "Hello";
}
有关更多信息/不同方法,请查看:http://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/spring-mvc-request-param/