IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring验证用户输入参数List -> 正文阅读

[Java知识库]Spring验证用户输入参数List

1. 简介

验证用户输入是任何应用程序中的常见要求。我们将介绍验证对象列表作为Spring控制器参数的方法。

我们将在控制器层添加验证,以确保用户指定的数据满足指定的条件。

2. 给 Bean 添加约束

对于我们的示例,我们将使用一个简单的 Spring 控制器来管理电影数据库。我们将专注于接受电影列表并在对列表执行验证后将它们添加到数据库中的方法。

因此,让我们首先使用javax 验证在Movie bean上添加约束:

public class Movie {

    private String id;

    @NotEmpty(message = "Movie name cannot be empty.")
    private String name;

    private @Valid xxxReqDTO xxx;

	private List<@Valid xxxxReqDTO> xxxxList;

    // standard setters and getters
}

3.在控制器中添加验证注解

让我们看看我们的控制器。首先,我们将@Validated注解添加到控制器类:

@Validated
@RestController
@RequestMapping("/movies")
public class MovieController {

    @Autowired
    private MovieService movieService;

    //...
}

接下来,让我们编写控制器方法,我们将在其中验证传入的Movie对象列表。

我们将@NotEmpty注释添加到我们的电影列表中,以验证列表中应该至少有一个元素。同时,我们将添加@Valid注解以确保Movie对象本身是有效的:

@PostMapping
public void addAll(@RequestBody @NotEmpty(message = "Input movie list cannot be empty.") List<@Valid Movie> movies) {
    movieService.addAll(movies);
}

如果我们使用空的电影列表输入调用控制器方法,那么验证将因为@NotEmpty注释而失败,我们将看到以下消息:

Input movie list cannot be empty.

@Valid注释将确保为列表中的每个对象评估Movie类中指定的约束。因此,如果我们在列表中传递一个名称为空的Movie ,验证将失败并显示以下消息:

Movie name cannot be empty.

4. 自定义验证器

我们还可以将自定义约束验证器添加到输入列表中。

对于我们的示例,自定义约束将验证输入列表大小限制为最多四个元素的条件。让我们创建这个自定义约束注释:

@Constraint(validatedBy = MaxSizeConstraintValidator.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface MaxSizeConstraint {
    String message() default "The input list cannot contain more than 4 movies.";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

现在,我们将创建一个应用上述约束的验证器:

public class MaxSizeConstraintValidator implements ConstraintValidator<MaxSizeConstraint, List<Movie>> {
    @Override
    public boolean isValid(List<Movie> values, ConstraintValidatorContext context) {
        return values.size() <= 4;
    }
}

最后,我们将@MaxSizeConstraint注释添加到我们的控制器方法中:

@PostMapping
public void addAll(
  @RequestBody
  @NotEmpty(message = "Input movie list cannot be empty.")
  @MaxSizeConstraint
  List<@Valid Movie> movies) {
    movieService.addAll(movies);
}

在这里,@MaxSizeConstraint将验证输入的大小。因此,如果我们在输入列表中传递超过四个Movie对象,验证将失败。

5. 处理异常

如果任何验证失败,则会引发ConstraintViolationException 。现在,让我们看看如何添加一个异常处理组件来捕获这个异常。

@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity handle(ConstraintViolationException constraintViolationException) {
    Set<ConstraintViolation<?>> violations = constraintViolationException.getConstraintViolations();
    String errorMessage = "";
    if (!violations.isEmpty()) {
        StringBuilder builder = new StringBuilder();
        violations.forEach(violation -> builder.append(" " + violation.getMessage()));
        errorMessage = builder.toString();
    } else {
        errorMessage = "ConstraintViolationException occured.";
    }
    return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
 }

6. 测试 API

现在,我们将使用有效和无效输入来测试我们的控制器。

首先,让我们向 API 提供有效的输入:

curl -v -d [{"name":"Movie1"}] -H "Content-Type: application/json" 
-X POST http://localhost:8080/movies

在这种情况下,我们将收到 HTTP 状态 200 响应:

...
HTTP/1.1 200
...

接下来,我们将在传递无效输入时检查我们的 API 响应。

让我们尝试一个空列表:

curl -d [] -H "Content-Type: application/json" -X POST http://localhost:8080/movies

在这种情况下,我们将获得 HTTP 状态 400 响应。这是因为输入不满足@NotEmpty约束。

Input movie list cannot be empty.

接下来,让我们尝试在列表中传递五个Movie对象:

curl -d [{"name":"Movie1"},{"name":"Movie2"},{"name":"Movie3"},
{"name":"Movie4"},{"name":"Movie5"}]  
-H "Content-Type: application/json" -X POST http://localhost:8080/movies

这也将导致 HTTP 状态 400 响应,因为我们未通过@MaxSizeConstraint约束:

The input list cannot contain more than 4 movies.
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:20:27  更:2022-05-12 16:23:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:53:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码