SpringBoot通过JSON传递请求参数的实例详解

 更新时间:2022年11月24日 15:17:29   作者:IT利刃出鞘  
这篇文章主要介绍了SpringBoot通过JSON传递请求参数,示例介绍SpringMVC如何通过JSON格式传递入参,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

简介

本文用示例介绍SpringMVC如何通过JSON格式传递入参。

JSON格式使用post方式来请求,即:对应的注解为:@PostMapping。

@PostMapping注解的方法可以接收1个@RequestBody标记的参数和多个没有@RequestBody标记的参数

代码

Entity

User.java

package com.example.demo.entity;
 
import lombok.Data;
import java.util.List;
 
@Data
public class User {
    private String name;
    private Integer age;
    private String[] password;
    private List<Integer> scoreArray;
}

Account.java

package com.example.demo.entity;
 
import lombok.Data;
import java.io.Serializable;
 
@Data
public class Account implements Serializable {
    private String phoneNum;
    private String[] emails;
}

Controller

package com.example.demo.controller;
 
import com.example.demo.entity.User;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
 
import java.util.Arrays;
import java.util.List;
 
@RequestMapping("/json")
@RestController
public class JsonController {
    @PostMapping("/1")
    public User setUserNoAnnotation(User user, List<String> password, Integer[] scoreArray) {
        printUser(user);
        return user;
    }
 
    @RequestMapping("/2")
    public User setUserAnnotation(@RequestBody User user) {
        printUser(user);
        return user;
    }
 
    @RequestMapping("/3")
    public User setUserAnnotation1(@RequestBody User user, @RequestParam List<String> password, Integer[] scoreArray) {
        System.out.println(password);
        if (scoreArray != null) {
            System.out.println(Arrays.asList(scoreArray));
        } else {
            System.out.println("scoreArray = null");
        }
        System.out.println();
        printUser(user);
 
        return user;
    }
 
    @RequestMapping("/4")
    public User setUserAnnotation2(@RequestBody User user, @RequestBody List<String> password, @RequestBody Integer[] scoreArray) {
        if (password != null) {
            System.out.println(password);
        } else {
            System.out.println("password = null");
        }
 
        if (scoreArray != null) {
            System.out.println(Arrays.asList(scoreArray));
        } else {
            System.out.println("scoreArray = null");
        }
        System.out.println();
        printUser(user);
        return user;
    }
 
    private void printUser(User user){
        System.out.println("name            : " + user.getName());
        System.out.println("password        : " + Arrays.asList(user.getPassword()));
        System.out.println("scoreArray      : " + user.getScoreArray());
        System.out.println("acount.phoneNum : " + user.getAccount().getPhoneNum());
        System.out.println("account.emails  : " + Arrays.asList(user.getAccount().getEmails()));
    }
}

测试

为方便测试,我用了knife4j

测试前提

json的body

{
    "name": "Jarvis",
    "password": [
        "ab",
        "cd"
    ],
    "scoreArray": [
        99,
        98
    ],
    "account": {
        "phoneNum": "123",
        "emails": [
            "123@qq.com",
            "456@163.com"
        ]
    }
}

正确的用法

1个RequestBody

0个@RequestBody,多个无@RequestBody

1个@RequestBody,多个无@RequestBody

错误的用法(会报错)

多个@RequestBody

后端报错信息

2022-09-20 22:04:45.857  WARN 3340 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.io.IOException: Stream closed]

错误原因

每个方法只能有一个@RequestBody。使用@RequestBody把请求转化为特定的Object(在最后会关闭相应的流),所以在同一个方法中第二次使用@RequestBody是没用的,因为流已经关闭。

You cannot use it this way as only one @RequestBody per method is allowed. Using @RequestBody Spring converts incoming request body into the specified object (what closes the stream representing body at the end) so attempting to use @RequestBody second time in the same method makes no sense as stream has been already closed.

不带@RequestBody参数类型是List

后端错误信息

2022-09-20 23:19:11.044 ERROR 3340 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No primary or default constructor found for interface java.util.List] with root cause
java.lang.NoSuchMethodException: java.util.List.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_201]
    at java.lang.Class.getDeclaredConstructor(Class.java:2178) ~[na:1.8.0_201]
    ...(其他信息)

错误原因

不支持非@RequstBody的参数是List类型。(数组类型可以)。

到此这篇关于SpringBoot通过JSON传递请求参数的文章就介绍到这了,更多相关springboot传递请求参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • feign 调用第三方服务中部分特殊符号未转义问题

    feign 调用第三方服务中部分特殊符号未转义问题

    这篇文章主要介绍了feign 调用第三方服务中部分特殊符号未转义问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java Swing中JDialog实现用户登陆UI示例

    Java Swing中JDialog实现用户登陆UI示例

    这篇文章主要介绍了Java Swing中JDialog实现用户登陆UI功能,结合完整实例形式分析了Swing使用JDialog实现用户登陆UI界面窗口功能的步骤与相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • springboot项目中添加自定义日志及配置过程

    springboot项目中添加自定义日志及配置过程

    这篇文章主要介绍了springboot项目中添加自定义日志,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • JavaSE学习之内部类及常用API

    JavaSE学习之内部类及常用API

    这篇文章主要介绍了JavaSE中的内部类和几个常用的API,文中的示例代码介绍详细,对我们学习JavaSEI有一定的帮助,感兴趣的小伙伴可以跟随小编一起学习一下
    2021-12-12
  • SpringCloud Feign参数问题及解决方法

    SpringCloud Feign参数问题及解决方法

    这篇文章主要介绍了SpringCloud Feign参数问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 解决Error:(5, 28) java: 程序包org.apache.ibatis.io不存在问题

    解决Error:(5, 28) java: 程序包org.apache.ibatis.io

    这篇文章主要介绍了解决Error:(5, 28) java: 程序包org.apache.ibatis.io不存在问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • SpringBoot POST请求接收多个参数值为null问题

    SpringBoot POST请求接收多个参数值为null问题

    SpringBoot接口中POST请求接收JSON数据时,使用简单类型接收会报null,需要封装成实体类或使用Map(并注明泛型)接收,并且使用@RequestBody注解
    2025-02-02
  • java Zookeeper简述

    java Zookeeper简述

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。下面通过本文给大家分享java 中 zookeeper简单使用,需要的朋友参考下吧
    2021-09-09
  • SpringBoot+Hutool+thymeleaf完成导出Excel的实现方法

    SpringBoot+Hutool+thymeleaf完成导出Excel的实现方法

    这篇文章主要介绍了SpringBoot+Hutool+thymeleaf完成导出Excel,本篇示例当中不仅仅有后端,而且还提供了前端html,html当中利用js将后端 输出流直接下载为文件,需要的朋友可以参考下
    2022-03-03
  • Mybatis配置之typeAlias标签的用法

    Mybatis配置之typeAlias标签的用法

    这篇文章主要介绍了Mybatis配置之typeAlias标签的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论