Spring Boot List参数详解

在开发过程中,我们经常会遇到需要接收列表类型的参数。Spring Boot提供了多种方式来接收和处理列表参数,本文将详细介绍这些方式,并通过代码示例来演示它们的用法和效果。

List类型参数概述

在Spring Boot中,我们可以通过不同的方式接收列表类型的参数,例如在URL中使用逗号分隔的字符串、使用数组参数、使用@RequestParam注解等等。不同的方式适合不同的场景和需求,下面我们将分别介绍这些方式,并给出相应的代码示例。

1. 逗号分隔的字符串

一种常见的处理列表参数的方式是使用逗号分隔的字符串。在URL中,我们可以将多个值拼接在一起,通过逗号进行分隔。在Spring Boot中,可以使用@RequestParam注解将这个逗号分隔的字符串作为参数接收,并将其转换为List类型。

下面是一个使用逗号分隔的字符串接收列表参数的示例代码:

@GetMapping("/users")
public String getUsers(@RequestParam("ids") List<Long> userIds) {
    // 处理用户ID列表
    return "success";
}

在上面的代码中,我们使用@RequestParam注解接收名为ids的参数,并将其转换为List<Long>类型。当我们调用/users接口时,可以传递逗号分隔的字符串作为ids参数的值,Spring Boot会自动将其解析成List<Long>类型的参数。

例如,我们可以请求URL:/users?ids=1,2,3,Spring Boot会将ids参数的值解析成List<Long>类型,并将其中的元素分别设置为1、2和3。

2. 使用数组参数

除了逗号分隔的字符串,我们还可以使用数组参数来接收列表类型的参数。在Spring Boot中,可以使用@RequestParam注解结合数组来接收列表参数。

下面是一个使用数组参数接收列表参数的示例代码:

@GetMapping("/users")
public String getUsers(@RequestParam("ids") Long[] userIds) {
    // 处理用户ID列表
    return "success";
}

在上面的代码中,我们使用@RequestParam注解接收名为ids的参数,并将其转换为Long[]类型。当我们调用/users接口时,可以传递多个ids参数的值,Spring Boot会将其解析成Long[]类型的参数。

例如,我们可以请求URL:/users?ids=1&ids=2&ids=3,Spring Boot会将ids参数的值解析成Long[]类型,并将其中的元素分别设置为1、2和3。

3. 使用@RequestBody注解

如果我们需要接收非常复杂的列表参数,例如包含多个字段的对象列表,那么可以使用@RequestBody注解来接收列表参数。

下面是一个使用@RequestBody注解接收列表参数的示例代码:

@PostMapping("/users")
public String createUsers(@RequestBody List<User> users) {
    // 处理用户列表
    return "success";
}

在上面的代码中,我们使用@RequestBody注解接收名为users的参数,并将其转换为List<User>类型。当我们调用/users接口时,可以传递包含多个用户对象的JSON数组作为请求体,Spring Boot会自动将其转换成List<User>类型的参数。

例如,我们可以发送如下的HTTP请求:

POST /users HTTP/1.1
Content-Type: application/json

[
    {
        "id": 1,
        "name": "Alice"
    },
    {
        "id": 2,
        "name": "Bob"
    },
    {
        "id": 3,
        "name": "Charlie"
    }
]

Spring Boot会将请求体中的JSON数组解析成List<User>类型,并将其传递给createUsers方法进行处理。

类图

下面是本文所示例代码中使用的类的类图:

classDiagram
    class User {
        -id: Long
        -name: String
        +getId(): Long
        +setId(id: Long): void
        +getName(): String
        +setName(name: String): void
    }

在上面的类图中,我们定义了一个名为User的类,它有两个私有字段id和name,以及对应的getter和setter方法。

关系图

下面是本文所示例代码中