通常会遇到写接口时仅需要传入单个参数的情况,但是spring自带的参数解析器不支持解析这种传参,导致接收到的参数始终为null。

解决方案:

1、使用JSONObject与@RequestBody注解配合接收参数;

 @PostMapping("/getSingleParam")
 public void getSingleParam(@RequestBody JSONObject object){
     System.out.println(object.getString("name"));

2、使用Map与@RequestBody注解配合接收参数;

 @PostMapping("/getSingleParam")
 public void getSingleParam(@RequestBody Map<String, Object> map){
     System.out.println(map.get("name").toString());

3、以json字符串形式接收参数再通过JSONObject将json字符串转为对象,与方案1类似;

 @PostMapping("/getSingleParam")
 public void getSingleParam(@RequestBody String name){
     JSONObject object = JSONObject.parseObject(name);
     System.out.println(object.getString("name"));

最佳解决方案:

4、模仿@RequestParam自定义@RequestSingleParam注解来解析参数,@RequestParam从请求路径获取参数,自定义注解从request body中获取参数;

第一步:自定义@RequestSingleParam注解
 package com.blog.utils.aop;
 import org.springframework.web.bind.annotation.ValueConstants;
 import java.lang.annotation.*;
  * 自定义注解接收单个参数
  * @author created by wutong li on 2021/04/29
 @Target(ElementType.PARAMETER)
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 public @interface RequestSingleParam {
     String value();
     boolean required() default true;
     String defaultValue() default ValueConstants.DEFAULT_NONE;
第二步:实现HandlerMethodArgumentResolver接口,配置参数解析器
 package com.blog.utils.aop;
 import com.alibaba.fastjson.JSONObject;
 import org.springframework.core.MethodParameter;
 import org.springframework.web.bind.support.WebDataBinderFactory;
 import org.springframework.web.context.request.NativeWebRequest;
 import org.springframework.web.method.support.HandlerMethodArgumentResolver;
 import org.springframework.web.method.support.ModelAndViewContainer;
 import javax.servlet.http.HttpServletRequest;
 import java.io.BufferedReader;
  * RequestStringParam参数解析器 实现 HandlerMethodArgumentResolver 接口
  * @author created by wutong li on 2021/04/29
 public class RequestStringParamHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
     @Override
     public boolean supportsParameter(MethodParameter parameter) {
         return parameter.hasParameterAnnotation(RequestSingleParam.class);
     @Override
     public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                   NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
         RequestSingleParam requestSingleParam = parameter.getParameterAnnotation(RequestSingleParam.class);
         HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
         BufferedReader reader = request.getReader();
         StringBuilder sb = new StringBuilder();
         char[] buf = new char[1024];
         int rd;
         while ((rd = reader.read(buf)) != -1) {
             sb.append(buf, 0, rd);
         JSONObject jsonObject = JSONObject.parseObject(sb.toString());
         String value = requestSingleParam.value();
         return jsonObject.get(value);
第三步:配置WebMvcConfigurer注册自定义的参数解析器
 package com.blog.config;
 import com.blog.utils.aop.RequestStringParamHandlerMethodArgumentResolver;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.method.support.HandlerMethodArgumentResolver;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 import java.util.List;
  * 配置WebMvcConfigurer
  * @author created by wutong li on 2021/04/29
 @Configuration
 public class WebMvcConfig implements WebMvcConfigurer {
      * 注册自定义的参数解析器
     @Override
     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers){
         argumentResolvers.add(new RequestStringParamHandlerMethodArgumentResolver());
         WebMvcConfigurer.super.addArgumentResolvers(argumentResolvers);
第四步:在Controller中接收参数处加上@RequestSingleParam注解,再调一下接口就可以接收到单个的入参了
 @PostMapping("/getSingleParam")
 public void getSingleParam(@RequestSingleParam(value = "name") String name){
     System.out.println(name);
                    场景:通常会遇到写接口时仅需要传入单个参数的情况,但是spring自带的参数解析器不支持解析这种传参,导致接收到的参数始终为null。解决方案:1、使用JSONObject与@RequestBody注解配合接收参数; @PostMapping("/getSingleParam") public void getSingleParam(@RequestBody JSONObject object){     System.out.println(object.getString("name"));
				
前阵子开发程序的时候,由于公司用的不是 restful 风格的 api,同事问我根据id删除记录的接口,controller 层参数绑定要怎么写的问题,几番讨论下来,总结了几个方法 使用Map接收参数 @PostMapping("/delete") public ApiResponse delete(@RequestBody Map<String,String> params){
public class ParamFromJsonHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return par...
文章目录问题背景SpringBoot传递单一参数@RequestParam Post请求接收参数 一般都是对象,但是在只有一个参数的时候,封装个接收体,免的太繁琐,不如直接的单个参数接收. SpringBoot传递单一参数@RequestParam 注解@RequestParam接收参数是来自HTTP请求体或请求url的QueryString。 RequestParam可以接受简单类型的属性,也可以接受对象类型。 @RequestParam有三个配置参数: required 表示是否必须,默
Post请求接收参数 一般都是对象,但是在只有一个参数的时候,封装个接收体,免的太繁琐,不如直接的单个参数接收. 但是发现,使用(@RequestBody String str),接收大数据格式是{“str”:“xxxxx”},是一个json格式的字符串,so~~ JSONObject parse = JSONObject.parseObject(string); String ...
1.场景 ----feign调用时 对于Post请求而言,前端传给后端的数据为json的格式。但是有一种情况,比如就需要一个姓名 username,类型为String 如果用@RequestParam来接收 就会出如下问题 "Invalid mime type \": application/json\": Invalid token character ':' in token \": application\ 通常解决方式有两种 1: 新建一个类 把需要传递的字段作为新建类的属性 然...
在我们定义接口时通常会用到post请求,对于post请求我们如何接收从页面传过来的参数 以下总结了几种方法,适用于大多数类型 1.对于参数类型不确定的一个或多个参数类型 当我们post请求只有一两个参数时,不需要创建对象时,可以使用JSONObject实体类。 如下用post传递Integer类型,在controller层定义**getInteger()**方法; @ResponseBody @ApiOperation("transmit") @PostMapping("/transmit") public Result transmit(@RequestParam(required = false) @ApiParam(value = "id")String id ,@ApiParam(value = ...
@PostMapping("/myendpoint") public ResponseEntity<String> handlePostRequest(@RequestBody String request) { // 在这里处理 POST 请求,例如解析请求体,更新数据库,发送响应等等。 return ResponseEntity.ok("POST 请求已经成功处理!"); 在上面的示例,`@PostMapping("/myendpoint")` 注解用于将 `/myendpoint` 路径映射到 `handlePostRequest` 方法上,这意味着当客户端向 `/myendpoint` 发送 POST 请求时,该方法会被调用。`@RequestBody` 注解用于指示 Spring Boot 框架将请求的内容注入到 `request` 参数。 在方法体内,可以使用 `request` 参数来处理请求体的内容。最后,使用 `ResponseEntity` 类型的返回值来构建响应,例如 `ResponseEntity.ok("POST 请求已经成功处理!")` 表示向客户端返回 HTTP 状态码 200 和一条消息。 当然,上面只是示例代码,具体的实现方式会因为你的业务需求而不同。不过,这个代码片段可以让你了解 Spring Boot 如何接收 POST 请求。 ### 回答2: Spring Boot 是一个快速、方便的微服务框架,可以帮助我们简化 Web 应用的开发。在 Web 应用POST 请求是一种常用的数据提交方式。Spring Boot 提供了多种方式来处理 POST 请求。 首先,我们需要定义一个接收 POST 请求的控制器。例如,我们可以创建一个示例类: @RestController @RequestMapping("/post") public class PostController { @PostMapping("/submit") public String submit(@RequestBody String requestBody) { return "Submit success:" + requestBody; 这里使用了 @RestController 标记这是一个 REST 风格的控制器,使用 @RequestMapping 指定路由。同时,使用 @PostMapping 标记这是一个接收 POST 请求的方法。 在方法,使用 @RequestBody 标记参数,表示该方法需要接收请求的数据。可以根据实际情况传入对应的参数类型,例如使用 ObjectMapper 将 JSON 数据转换成 Java 对象。 当接收POST 请求时,Spring Boot 会自动将请求的数据转换成字符串,并传入 submit 方法。我们可以对这个字符串进行自定义的处理,例如将它保存到数据库。 除了使用 @RequestBody 接收 POST 请求的数据,还有其他方式可以接收 POST 请求。例如,可以使用 @RequestParam 标记方法参数,直接获取请求参数;或者使用 @ModelAttribute 将请求参数映射到 Java 对象。 总之,在 Spring Boot 接收 POST 请求非常简单,只需要定义一个对应的控制器,并在方法处理请求即可。需要注意的是根据实际情况选择不同的参数标记符号,以及进行数据转换和验证。 ### 回答3: SpringBoot是一个常用的Java框架,可以轻松地搭建Web应用程序。通过SpringBoot,开发者可以非常简单地实现接收Post请求的功能。 首先,需要在pom.xml加入相应的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 接着,在控制器类新增一个Post请求处理方法: ```java @RestController public class MyController { @PostMapping("/receive") public String receivePost(@RequestBody String data) { System.out.println("received data: " + data); // 执行具体的业务逻辑 return "success"; 在上述代码,使用`@PostMapping("/receive")`注解来标记能够接收Post请求的方法。`@RequestBody`注解用于接收请求的数据,数据类型为String。 接收到数据后,我们可以执行具体的业务逻辑,然后返回一个字符串作为响应。在示例代码,返回的是“success”。 除了使用`@RequestBody`标记来接收请求的数据,还可以使用@RequestParam或@PathVariable注解来接收请求参数和路径变量。 最后,在启动类添加注解@EnableAutoConfiguration,以启用SpringBoot自动配置,完成接收Post请求的功能。