如何优雅的实现无侵入性参数校验之spring-boot-starter-validation

在开发过程中,参数校验是一个非常重要的环节。但是,传统的参数校验方法往往需要在代码中手动添加大量的 if-else 语句,这不仅繁琐,而且容易出错。为了解决这个问题,我们可以使用无侵入性参数校验的方式来简化代码并提高开发效率。

而在 Spring Boot 中,我们可以使用 spring-boot-starter-validation 来实现无侵入性参数校验。这个 Starter 可以帮助我们自动完成参数校验,而不需要手动添加大量的代码。

使用 spring-boot-starter-validation 的方式非常简单。首先,在 pom.xml 中添加如下依赖:

maven 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

然后,在需要校验参数的方法中添加 @Validated 注解,并在需要校验的参数前添加 @NotBlank、@NotNull、@Min、@Max 等注解即可。例如:

java 复制代码
@PostMapping("/user")
public User createUser(@Validated @RequestBody User user) {
    return userService.createUser(user);
}

在上面的代码中,@Validated 注解表示需要进行参数校验,@RequestBody 注解表示接收的是一个 JSON 对象,而 User 类中的 @NotBlank、@NotNull 等注解表示对 User 对象中的相应属性进行校验。

例如:

java 复制代码
public class User {
	@NotBlank(message = "用户名不能为空")
	private String username;
	@NotBlank(message = "密码不能为空")
	private String password;
}

需要注意的是,如果参数校验不通过,会抛出 MethodArgumentNotValidException 异常。我们可以通过添加一个全局异常处理器来处理这个异常。例如:

java 复制代码
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<String> errorList = allErrors.stream().map(ObjectError::getDefaultMessage).collect(Collectors.toList());
        return ResponseEntity.badRequest().body(errorList.toString());
    }
}

在上面的代码中,我们定义了一个 GlobalExceptionHandler 类,并使用 @ControllerAdvice 注解表示这是一个全局异常处理器。当出现 MethodArgumentNotValidException 异常时,会调用 handleMethodArgumentNotValidException 方法来处理异常,并将校验失败的错误信息返回给客户端。

总之,使用 spring-boot-starter-validation 可以帮助我们实现无侵入性参数校验,从而简化代码并提高开发效率。希望本文能对大家有所帮助!

相关推荐
程序员-周李斌1 分钟前
ConcurrentHashMap 源码分析
java·开发语言·哈希算法·散列表·开源软件
ChrisitineTX25 分钟前
凌晨突发Java并发问题:synchronized锁升级导致接口超时,排查过程全记录
java·数据库·oracle
zzhongcy35 分钟前
Java: HashMap 和 ConcurrentHashMap的区别
java·开发语言
✎ ﹏梦醒͜ღ҉繁华落℘1 小时前
菜鸟的算法基础
java·数据结构·算法
老华带你飞1 小时前
社团管理|基于Java社团管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
shayudiandian1 小时前
用LangChain打造你自己的智能问答系统
java·数据库·langchain
invicinble2 小时前
spring相关系统性理解,企业级应用
java·spring·mybatis
jiayong232 小时前
Spring IOC 与 AOP 核心原理深度解析
java·spring·log4j
卿雪2 小时前
Redis 线程模型:Redis为什么这么快?Redis为什么引入多线程?
java·数据库·redis·sql·mysql·缓存·golang
lkbhua莱克瓦242 小时前
IO流练习(修改文件中的数据)
java·windows·学习方法·io流·java练习题·io流练习