spring boot中校验参数合法性
【摘要】 在Spring Boot中,校验参数的合法性通常涉及两个方面:一是定义参数校验的规则,二是确保在请求处理之前执行这些校验。下面我们先从理论层面介绍如何优雅地进行参数校验,然后给出一个实战的例子。 理论部分使用校验注解:Spring Boot支持JSR 303/380校验规范,它提供了一系列注解,如@NotNull、@Min、@Max、@Email等,用于定义参数的校验规则。这些注解可以直接加...
在Spring Boot中,校验参数的合法性通常涉及两个方面:一是定义参数校验的规则,二是确保在请求处理之前执行这些校验。下面我们先从理论层面介绍如何优雅地进行参数校验,然后给出一个实战的例子。
理论部分
-
使用校验注解:
Spring Boot支持JSR 303/380校验规范,它提供了一系列注解,如@NotNull
、@Min
、@Max
、@Email
等,用于定义参数的校验规则。这些注解可以直接加在请求方法的参数上或者DTO(Data Transfer Object)类的字段上。 -
使用DTO:
对于复杂的请求参数,建议使用DTO来封装参数。这样做的好处是:- 可以将校验规则与请求方法解耦,使代码更清晰。
- 可以方便地复用DTO,例如在不同的服务层或控制器中。
-
全局异常处理:
当参数校验失败时,Spring Boot会抛出一个MethodArgumentNotValidException
异常。为了给用户一个友好的提示,我们需要全局捕获这个异常,并返回自定义的错误信息。 -
分组校验:
对于同一个DTO,在不同的业务场景下可能需要不同的校验规则。这时可以使用JSR 303的分组校验功能。 -
自定义校验注解:
如果JSR 303提供的注解无法满足需求,可以自定义校验注解。
实战例子
假设我们有一个用户注册接口,需要校验用户名、密码和邮箱的合法性。
- 定义DTO
import javax.validation.constraints.*;
public class UserDTO {
@NotNull(message = "用户名不能为空")
@Size(min = 4, max = 20, message = "用户名长度必须在4到20个字符之间")
private String username;
@NotNull(message = "密码不能为空")
@Size(min = 6, max = 20, message = "密码长度必须在6到20个字符之间")
private String password;
@NotNull(message = "邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;
// getters and setters
}
- 在控制器中使用DTO
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Validated
public class UserController {
@PostMapping("/register")
public String register(@RequestBody @Validated UserDTO userDTO) {
// 处理注册逻辑
return "注册成功";
}
}
注意:在@RequestBody
和@Validated
注解之间没有任何参数,这是因为@Validated
默认会校验其后面的对象(即UserDTO
)。
- 全局异常处理
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.List;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> handleValidationExceptions(MethodArgumentNotValidException ex) {
List<FieldError> fieldErrors = ex.getBindingResult().getFieldErrors();
String errorMessage = fieldErrors.stream()
.map(FieldError::getDefaultMessage)
.reduce((s1, s2) -> s1 + "; " + s2)
.orElse("Validation failed");
return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
}
}
这样,当参数校验失败时,用户会收到一个包含具体错误信息的HTTP 400响应。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)