spring:参数校验
前言
后端初学者,写的内容只是当作自己的一个复习笔记,里面肯定有错误。目前只记录现阶段自己需要用到的内容
参数校验
在Spring Boot项目中,参数校验是非常重要的,它可以帮助我们确保传入的数据是有效的,从而提高系统的健壮性和安全性。下面将介绍几种常见的校验入参的方法。
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1. 使用 @Valid
和 @Validated
注解
这是最常用的方式,通过在方法参数上使用 @Valid
或 @Validated
注解来触发数据校验。你需要在你的实体类或DTO(Data Transfer Object)中定义校验规则,比如:
public class User {
@NotNull(message = "用户名不能为空")
private String username;
@Email(message = "邮箱格式不正确")
private String email;
// getters and setters
}
然后,在控制器中,你可以这样使用:
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public ResponseEntity<String> createUser(@Valid @RequestBody User user) {
// 处理业务逻辑
return ResponseEntity.ok("User created");
}
}
2. 定制错误处理
当参数校验失败时,Spring Boot 默认会返回一个400 Bad Request的HTTP响应,并且包含错误信息。如果你想要定制错误消息或者响应码,可以实现 ControllerAdvice
来捕获 MethodArgumentNotValidException
异常并进行自定义处理。
import com.onion.boot3management.results.Result;
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.HashMap;
import java.util.Map;
@RestControllerAdvice
public class GlobalExceptionHandler {
// 处理 @Valid 注解导致的参数校验异常
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField(); // 获取发生错误的字段名
String errorMessage = error.getDefaultMessage(); // 获取默认的错误信息
errors.put(fieldName, errorMessage); // 将字段名和错误信息存入 Map
});
return Result.error(errors.toString());
}
}
3. 参数级别的校验
除了对整个对象进行校验外,你还可以对单个参数进行校验。例如:
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(
@PathVariable @Min(value = 1, message = "ID 必须为正整数") Long id) {
// 查找用户并返回
}
4. 自定义校验注解
如果内置的校验注解无法满足需求,你可以创建自己的校验注解。首先定义一个注解:
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomValidator.class)
public @interface ValidMyCustom {
String message() default "Invalid value";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
然后编写对应的校验器:
public class MyCustomValidator implements ConstraintValidator<ValidMyCustom, String> {
@Override
public void initialize(ValidMyCustom constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 实现校验逻辑
return true; // 返回true表示验证通过
}
}
最后,在需要校验的地方使用这个自定义注解。
5. 组合校验
有时候你可能希望某些字段只在特定条件下进行校验,这时你可以使用分组校验功能。通过指定不同的校验组,可以在不同场景下启用不同的校验规则。
public class SuperuserParam {
@Null(groups = Create.class, message = "用户ID必须为空")
@NotNull(groups = Update.class, message = "用户ID不能为空")
@Schema(description = "用户ID")
// 使用雪花算法生成id
@TableId(type = IdType.ASSIGN_ID)
private Integer id;
@NotBlank(message = "用户code不能为空")
@Schema(description = "用户code")
private String code;
@NotBlank(message = "用户名称不能为空")
@Schema(description = "用户名称")
private String name;
@NotBlank(message = "用户密码不能为空")
@Schema(description = "用户密码")
private String password;
@Email(message = "邮箱格式不正确")
@NotNull(message = "邮箱不能为空")
@Schema(description = "邮箱")
private String email;
// 新增、修改参数校验组
public interface Create extends Default {
}
public interface Update extends Default {
}
}
// 控制器中指定使用哪个校验组
@PostMapping("/addSuperUser")
@ResponseBody
public Result addOrUpdateSuperUser(@Validated(SuperuserParam.Create.class) @Valid @RequestBody SuperuserParam param) {
return userService.addOrUpdateSuperUser(param);
}
// 修改管理员
@PostMapping("/updateSuperUser")
@ResponseBody
public Result updateSuperUser(@Validated(SuperuserParam.Update.class) @Valid @RequestBody SuperuserParam param) {
return userService.addOrUpdateSuperUser(param);
}
原文地址:https://blog.csdn.net/weixin_41897680/article/details/144307845
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!