无法在Spring REST控制器中将Map用作JSON @RequestParam

时间:2017-12-22 22:45:22

标签: spring spring-boot spring-restcontroller http-request-parameters

此控制器

@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: foo7bar{"a":"b"}@RequestBody 为什么Spring无法进行这种简单的转换?请注意,如果地图用作POST请求的{{1}},则无效。

2 个答案:

答案 0 :(得分:4)

以下是有效的解决方案: 只需将StringMap的自定义转换为@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/