如何使用@RequestBody调用@RestController?

mem*_*und 1 java spring servlets spring-web

我有一个简单的servlet,如下所示:

@RestController
public class TestServlet {
    @RequestMapping(value = "/test1")
    public String test1() {
        return "test1";
    }

    @RequestMapping(value = "/test2")
    public String test2(@RequestBody TestClass req) {
        return "test2";
    }

    public static class TestClass {
        private String value;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,只有不接收参数的servlet才起作用:

作品: http://localhost:8080/test1

不起作用: http://localhost:8080/test2?value=1234

org.springframework.http.converter.HttpMessageNotReadableException:缺少必需的请求正文:public java.lang.String

为什么@RequestBody注释不起作用?我错过了重要的一块吗?

Kla*_*aek 5

一之间的区别@Controller,并@RestController是,你不必编写@RequestBody@ResponseBody,这意味着在你的控制器方法的任何参数,它不具有注释(如@PathVariable@ModelAttribute...)将隐含有@RequestBody,因此必须张贴HTTP实体主体。因此,您需要在POST中发送JSON / XML。您要做的是将数据作为URL的一部分发送,这使其成为请求参数而非主体数据,并且您需要@RequestParam从URL提取数据。

另外,我建议您在注释中使用@GetMapping/ @PostMapping或包含method参数,@RequestMapping因为您不太可能希望将服务用于POST和GET,因此在控制器方法说明中应尽可能具体,以限制错误情况。