使用 Spring Boot 和 DTO 进行数据验证

22软件技术-柯进才 2023-05-15 13:13:36

Spring Boot 是一个非常流行的 Java Web 应用程序开发框架,它提供了很多方便的功能,让开发者可以快速构建出高效、安全的 Web 应用。在开发 Web 应用程序时,数据验证是非常重要的一环。通过使用 DTO(Data Transfer Object)来验证数据,可以确保应用程序中输入的数据是有效和合法的。本文将介绍如何使用 Spring Boot 和 DTO 进行数据验证。

什么是DTO

DTO,即 Data Transfer Object,是用于数据传输的对象。它通常用于封装从数据库、文件或其他数据源中获取的数据,以便于在应用程序的不同层之间传输。DTO 对象应该包含与数据库表或 API 请求相对应的字段。

DTO验证规则

使用 DTO 对象来验证输入数据是一种很好的方式。可以使用 Bean Validation API 来为 DTO 对象添加验证规则。这些规则可以包括以下内容:是否为空、长度、正则表达式、范围等。在 DTO 类中使用注解来添加验证规则。以下是一些常用的注解:

  • @NotNull: 验证字段不能为空
  • @Size: 验证字段的长度是否在指定的范围内
  • @Pattern: 验证字段是否符合指定的正则表达式
  • @Min: 验证字段是否大于或等于指定的值
  • @Max: 验证字段是否小于或等于指定的值

可以根据需要在 DTO 类中添加多个注解来验证字段。

DTO验证实现步骤

1.依赖引入

首先,在 pom.xml 文件中添加DTO验证的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

该依赖引入了 Spring Boot 中的 Bean Validation API。

2.DTO对象

创建一个 DTO 对象,其中包含需要验证的字段。DTO 对象应该包含与数据库表或 API 请求相对应的字段。

public class UserDTO {
    @NotNull(message = "用户名不能为空")
    @Size(min = 6, max = 20, message = "用户名长度必须在6到20个字符之间")
    private String username;
 
    @NotNull(message = "密码不能为空")
    @Size(min = 6, max = 20, message = "密码长度必须在6到20个字符之间")
    private String password;
 
    // getter and setter
}

3.添加验证规则

在 DTO 类中使用 Bean Validation API 来添加验证规则。例如,在上面的 UserDTO 类中,@NotNull 和 @Size 注解分别用于验证 username password 字段是否为空和长度是否符合要求。

4.控制器中使用 @Validated 注解来验证 DTO 对象

在控制器中使用 @Validated 注解来验证 DTO 对象。如果 DTO 对象不符合验证规则,将抛出 BindException异常

@RestController
@RequestMapping("/users")
public class UserController {
 
    @PostMapping
    public UserDTO createUser(@RequestBody @Validated UserDTO user) {
        // TODO: 创建用户
        return user;
    }
}

5,全局捕捉DTO验证异常

如果 DTO 对象不符合验证规则,使用 @ExceptionHandler 注解来处理异常,全局捕捉BindException,并将错误信息返回给客户端。

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * DTO参数异常验证处理
     *
     * @param e 异常类
     * @return 错误信息
     */
    @ExceptionHandler(BindException.class)
    public ResponseResult methodArgumentNotValidException(BindException e) {
        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
        List<String> messages = allErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.toList());
        return ResponseResult.errorResult(400, messages.get(0));
    }

}

验证错误实例

{
	"code": 400,
	"msg": "用户名不能为空"
}

在上面的代码中,@Validated 注解用于验证传入的 UserDTO 对象。如果 UserDTO 对象不符合验证规则,将抛出 BindException异常。在异常处理方法中,我们使用了 @RestControllerAdvice 注解标注了一个类,这个类可以处理所有控制器中抛出的异常。然后我们使用 @ExceptionHandler 注解捕获了 BindException 异常,并将其处理为一个 ResponseResult 类型的错误响应。我们使用了 BindingResult 对象获取了所有错误信息,并将其转换为了一个错误信息列表。最后,我们使用 ResponseResult 类创建了一个错误响应,并将错误信息添加到响应中返回给客户端。使用 @RestControllerAdvice 注解可以让我们在整个应用程序中集中处理异常,并将代码中的异常处理代码减少到最小。这可以使代码更加简洁和易于维护。

现在,我们已经成功地使用 DTO 对象和 Bean Validation API 对输入数据进行了验证。使用 DTO 对象来验证输入数据可以确保应用程序中输入的数据是有效和合法的,避免了一些潜在的问题。在实际开发中,可以根据需要对 DTO 对象添加不同的验证规则。

总结

本文介绍了如何使用 Spring Boot 和 DTO 对象来验证输入数据。使用 DTO 对象来验证输入数据可以确保应用程序中输入的数据是有效和合法的,避免了一些潜在的问题。在实际开发中,可以根据需要对 DTO 对象添加不同的验证规则。希望本文能对您有所帮助。

...全文
671 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
酸甜苦辣汤 2023-05-29
  • 打赏
  • 举报
回复
很有用,听君一席话,如听一席话
不想说话而已 2023-05-18
  • 打赏
  • 举报
回复

感谢博主分享!

Cqssss_ 2023-05-18
  • 打赏
  • 举报
回复

博主太厉害了,学到了!!!!

  • 打赏
  • 举报
回复
感谢博主分享,学废了,望博主再多发点。
  • 打赏
  • 举报
回复

666

programmer-xq 2023-05-17
  • 打赏
  • 举报
回复 1
gpt生成很快
  • 打赏
  • 举报
回复 1

谢谢博主分享

1,365

社区成员

发帖
与我相关
我的任务
社区描述
柳职院电子信息工程学院同学们的学习园地
社区管理员
  • c_university_1974
  • qq_39231145
  • zhuisir
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

各位加入社区的同学,请完善社区信息,把社区昵称改为【班级-姓名】,社区签名改为【班级-学号-姓名】的格式

如【社区昵称】20计应1班  张某某(班级用简称)

     【社区签名】2020级计算机应用技术1班 20201234567 张某某 (班级用全称)

试试用AI创作助手写篇文章吧