当前位置: 首页 > 知识库问答 >
问题:

@requestParam,内容类型为application/x-www-form-urlencoded在Spring Boot 2.2中不起作用

冷善
2023-03-14
@PostMapping(path = "/test", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public void test(@RequestParam Map<String, String> params) {
    System.out.println(params);
}

我激发下面的请求,它在一个项目中工作,但不是另一个项目。我试图禁用所有筛选器和参数解析器,但没有任何工作。

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "param1=1&param2=2" http://localhost:8080/test

任何帮助或想法都将不胜感激。另外,如果有人能给我指出Spring解析参数的地方,我可以试着调试,看看会发生什么。

共有1个答案

唐和洽
2023-03-14

添加另一个答案,因为我遇到了同样的问题,但以不同的方式解决了它。

我也有一个请求日志过滤器,它以Jonas Pedersen的回答中描述的类似方式包装传入的请求并缓存响应输入流。Spring Boot从2.1.2.release更新到2.3.4.release

我将传入请求包装在缓存请求包装器中,该包装器缓存输入流。对我来说,问题是由于某些原因(到目前为止还未知),request.getParameterValue(String key)方法返回null,尽管包装的请求显然有一个非空的参数映射。简单地访问包装的请求参数映射就为我解决了这个问题...非常奇怪。

原始包装器类,与Spring Boot 2.1.2一起工作。发布:

public class CachingRequestWrapper extends HttpServletRequestWrapper {

    private final byte[] cachedBody;

    public CachingRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        InputStream requestInputStream = request.getInputStream();
        this.cachedBody = StreamUtils.copyToByteArray(requestInputStream);
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        return new CachedInputStream(this.cachedBody);
    }

    @Override
    public BufferedReader getReader() throws IOException {
        ByteArrayInputStream byteArrayInputStream =
                new ByteArrayInputStream(this.cachedBody);
        String encoding = StringUtils.isEmpty(this.getCharacterEncoding())
                ? StandardCharsets.UTF_8.name()
                : this.getCharacterEncoding();
        return new BufferedReader(new InputStreamReader(byteArrayInputStream, encoding));
    }
}

为了简洁起见,省略了CachedInputStream类的实现。

public class CachingRequestWrapper extends HttpServletRequestWrapper {

    private final byte[] cachedBody;
    private final Map<String, String[]> parameterMap;

    public CachingRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        parameterMap = request.getParameterMap(); // <-- This was the crucial part
        InputStream requestInputStream = request.getInputStream();
        this.cachedBody = StreamUtils.copyToByteArray(requestInputStream);
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        return this.parameterMap; // this was added just to satisfy spotbugs
    }
}
 类似资料: