Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringServlet中将JSON POST参数作为@RequestParam接受?_Java_Json_Spring_Spring Mvc - Fatal编程技术网

Java 如何在SpringServlet中将JSON POST参数作为@RequestParam接受?

Java 如何在SpringServlet中将JSON POST参数作为@RequestParam接受?,java,json,spring,spring-mvc,Java,Json,Spring,Spring Mvc,我正在尝试创建一个POSTservlet,它应该通过JSON请求调用。以下内容应该有效,但不能。可能遗漏了什么 @RestController public class MyServlet { @PostMapping("/") public String test(@RequestParam String name, @RequestParam String[] params) { return "name was: " + name; } } JSO

我正在尝试创建一个
POST
servlet,它应该通过
JSON
请求调用。以下内容应该有效,但不能。可能遗漏了什么

@RestController
public class MyServlet {
    @PostMapping("/")
    public String test(@RequestParam String name, @RequestParam String[] params) {
        return "name was: " + name;
    }
}
JSON帖子:

{
   "name": "test",
   "params": [
      "first", "snd"
   ]
}
结果:名称始终为空。为什么?


“无法创建响应:org.springframework.web.bind.MissingServletRequestParameterException:所需字符串参数'name'不存在”

通常,我不会在POST方法中传递请求参数。相反,我使用DTO将其传递到身体中,如:

@RequestMapping(value = "/items", method = RequestMethod.POST)
    public void addItem(@RequestBody ItemDTO itemDTO) 

然后,您需要将ItemDTO创建为带有必要字段的POJO。

除了@stzoannos answer,如果您不想为json对象创建POJO,您可以使用库将json解析为JsonObject类,该类允许通过与get和set方法相同的方法处理参数

JsonObject jsonObj = new JsonParser().parse(json).getAsJsonObject();
return "name is: " + jsonObj.get("name").getAsString();

使用@RequestBody参数,该参数将给出结果创建
@GetController
并将其作为get查询字符串发送是可行的,但我需要POST+JSON。@PawanPandey如果我对这两个参数都使用
@RequestBody
,我会得到一个错误:
“无法创建响应:org.springframework.http.converter.httpMessageNodeTableException:缺少必需的请求正文:public java.lang.String MyServlet.test(java.lang.String,java.lang.String[])”
具有类似mydata{name;params[];}的pojo类和at控制器写入测试(@RequestBody mydata)并检查请求头中的内容类型是否为application/jsoni是否还有其他机会?如果可能的话,我希望不必创建dto(因为我希望能够使用eg
@RequestParam(required=false,defaultValue=“some”)
关于POST参数您可以使用hashmap进行操作,但您需要使用
@RequestBody
来接受POST参数。或者,将json字符串化并传入POST url的查询字符串,然后在mapOk中获取@RequestParam,作为替代方法,您可以只使用
@RequestBody Map
Map.get(“format”);Map.get(“params”)
。如果仅将少数参数作为json传递,则更适合使用此选项,因此此处不需要DTO。