从 Spring Boot 控制器方法读取 HttpServletRequest 对象

Moh*_*ana 0 java rest spring spring-mvc spring-boot

下面是我的控制器方法定义

@Autowired
private HttpServletRequest request;

@PostMapping(path = "/abc")
public String createAbc(@RequestBody HttpServletRequest request)
        throws IOException {

    logger.info("Request body: "+request.getInputStream());

    return "abc";

}
Run Code Online (Sandbox Code Playgroud)

我想要做的就是打印内容以请求正文。但是当我发出 POST 请求时,我看到以下错误:

类型定义错误:[简单类型,类javax.servlet.http.HttpServletRequest];嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造实例javax.servlet.http.HttpServletRequest(没有创建者,如默认构造,存在):抽象类型要么需要映射到具体类型,有自定义反序列化器,要么包含其他类型信息\n 在 [来源: (PushbackInputStream); 行:1,列:2]",

我使用的是 Spring boot 2.x 版本。知道我的代码有什么问题吗?

And*_*eas 12

首先,删除@Autowired字段。这是错误的,无论如何你都没有使用它。

现在你有两个选择:

  1. 让 Spring 为您处理请求正文,通过使用@RequestBody注释:

    @PostMapping(path = "/abc")
    public String createAbc(@RequestBody String requestBody) throws IOException {
        logger.info("Request body: " + requestBody);
        return "abc";
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 自己处理,即不使用@RequestBody注解:

    @PostMapping(path = "/abc")
    public String createAbc(HttpServletRequest request) throws IOException {
        StringBuilder builder = new StringBuilder();
        try (BufferedReader in = request.getReader()) {
            char[] buf = new char[4096];
            for (int len; (len = in.read(buf)) > 0; )
                builder.append(buf, 0, len);
        }
        String requestBody = builder.toString();
        logger.info("Request body: " + requestBody);
        return "abc";
    }
    
    Run Code Online (Sandbox Code Playgroud)

不知道为什么要使用选项 2,但如果您愿意,可以使用。