SpringBoot2之PUT请求接收不了参数如何解决

发布时间:2022-07-02 10:18:02 作者:iii
来源:亿速云 阅读:418

SpringBoot2之PUT请求接收不了参数如何解决

在使用Spring Boot 2进行Web开发时,开发者可能会遇到一个常见的问题:PUT请求无法正确接收参数。这个问题通常是由于Spring Boot的默认配置或请求处理方式导致的。本文将详细探讨这个问题的原因,并提供几种解决方案。

问题描述

在Spring Boot 2中,当使用PUT请求时,开发者可能会发现无法通过@RequestParam@RequestBody注解正确获取请求参数。例如,以下代码:

@RestController
public class MyController {

    @PutMapping("/update")
    public String update(@RequestParam String name) {
        return "Updated: " + name;
    }
}

在发送PUT请求时,name参数可能始终为null,即使请求体中包含了该参数。

问题原因

这个问题的根本原因在于Spring Boot 2默认使用的HttpPutFormContentFilter已经被弃用,并且在Spring Boot 2.1及以上版本中被移除。HttpPutFormContentFilter的作用是将PUT请求的表单数据解析为可用的参数,但由于其被移除,PUT请求的表单数据不再自动解析。

解决方案

解决方案1:使用@RequestBody注解

如果你希望接收JSON格式的请求体,可以使用@RequestBody注解来接收参数。例如:

@RestController
public class MyController {

    @PutMapping("/update")
    public String update(@RequestBody Map<String, String> requestBody) {
        String name = requestBody.get("name");
        return "Updated: " + name;
    }
}

在这种情况下,请求体应该是一个JSON对象,例如:

{
    "name": "John"
}

解决方案2:使用@RequestParam注解并手动解析表单数据

如果你仍然希望使用@RequestParam注解来接收表单数据,可以手动解析表单数据。首先,你需要确保请求的Content-Typeapplication/x-www-form-urlencoded。然后,你可以使用HttpServletRequest来手动获取参数:

@RestController
public class MyController {

    @PutMapping("/update")
    public String update(HttpServletRequest request) {
        String name = request.getParameter("name");
        return "Updated: " + name;
    }
}

解决方案3:自定义过滤器

如果你希望恢复HttpPutFormContentFilter的功能,可以自定义一个过滤器来解析PUT请求的表单数据。以下是一个简单的自定义过滤器示例:

import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component
public class PutFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        if ("PUT".equalsIgnoreCase(httpRequest.getMethod())) {
            request = new HttpPutFormContentRequestWrapper(httpRequest);
        }
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

然后,你需要在Spring Boot应用中注册这个过滤器:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<PutFilter> putFilterRegistration() {
        FilterRegistrationBean<PutFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new PutFilter());
        registration.addUrlPatterns("/*");
        return registration;
    }
}

解决方案4:使用@ModelAttribute注解

如果你希望接收表单数据并将其绑定到一个对象中,可以使用@ModelAttribute注解。例如:

@RestController
public class MyController {

    @PutMapping("/update")
    public String update(@ModelAttribute MyForm form) {
        return "Updated: " + form.getName();
    }
}

class MyForm {
    private String name;

    // getters and setters
}

在这种情况下,请求体应该是一个表单数据,例如:

name=John

总结

在Spring Boot 2中,PUT请求无法接收参数的问题通常是由于HttpPutFormContentFilter被移除导致的。通过使用@RequestBody、手动解析表单数据、自定义过滤器或@ModelAttribute注解,开发者可以有效地解决这个问题。选择哪种解决方案取决于具体的应用场景和需求。希望本文提供的解决方案能够帮助你顺利解决PUT请求接收参数的问题。

推荐阅读:
  1. SpringMVC处理Put或Delete请求报错及解决方法
  2. JavaScript中怎么接收get请求参数

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot put

上一篇:Java File分隔符和Path分隔符如何使用

下一篇:map, mergeMap和switchMap的区别是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》