Ver Fonte

# feat:参数校验;校验失败的全局异常处理器

yang yi há 1 semana atrás
pai
commit
62bf89ee9d

+ 5 - 5
src/main/java/space/anyi/serve/controller/UserController.java

@@ -44,10 +44,10 @@ public class UserController {
      */
     @GetMapping
     public Response<PageVo<List<UserVo>>> queryByPage(
-            String account,
-            String username,
-            String role,
-            @RequestParam(defaultValue = "1") Integer enable,
+            @NotNull @RequestParam(defaultValue = "") String account,
+            @NotNull @RequestParam(defaultValue = "") String username,
+            @NotNull @RequestParam(defaultValue = "") String role,
+            @NotNull @RequestParam(defaultValue = "1") Integer enable,
             @NotNull(message = "页码不能为null") @RequestParam(defaultValue = "1") Integer pageNum,
             @NotNull(message = "分页大小不能为null")@RequestParam(defaultValue = "10") Integer pageSize) {
         User user = new User();
@@ -105,7 +105,7 @@ public class UserController {
      * @return 删除是否成功
      */
     @DeleteMapping
-    public Response<Boolean> deleteById(@NotEmpty(message = "ID列表不能为空") List<String> ids) {
+    public Response<Boolean> deleteById(@NotEmpty(message = "ID列表不能为空") @RequestParam List<String> ids) {
         List<Long> list = ids.stream().map(Long::valueOf).toList();
         return Response.ok(this.userService.deleteById(list));
     }

+ 8 - 1
src/main/java/space/anyi/serve/entity/Response.java

@@ -13,7 +13,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 @Schema(description = "后端统一的响应实体")
 public final class Response<T> {
     public static final Integer SUCCESS_CODE = 200;
-    public static final Integer ERROR_CODE = 200;
+    public static final Integer ERROR_CODE = 400;
 
     @Schema(description = "状态码;200:成功")
     private Integer code;
@@ -85,6 +85,13 @@ public final class Response<T> {
         response.setMessage(message);
         return response;
     }
+    public static <T> Response<T> error(String message,T data){
+        Response<T> response = new Response<>();
+        response.setCode(ERROR_CODE);
+        response.setMessage(message);
+        response.setData(data);
+        return response;
+    }
 
     /**
      * 自定义封装

+ 69 - 0
src/main/java/space/anyi/serve/handler/GlobalExceptionHandler.java

@@ -0,0 +1,69 @@
+package space.anyi.serve.handler;
+
+import jakarta.validation.ConstraintViolationException;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.View;
+import space.anyi.serve.entity.Response;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @fileName: GlobalExceptionHandler
+ * @projectName: serve
+ * @package: space.anyi.serve.handler
+ * @author: 杨逸
+ * @date:2026/4/29 17:01
+ * @description: 全局异常处理
+ */
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+
+    // 处理参数校验失败异常
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public Response<List<FieldError>> handleValidationExceptions(MethodArgumentNotValidException ex) {
+        List<FieldError> fieldErrors = ex.getFieldErrors()
+                .stream()
+                .map(error -> new FieldError(error.getObjectName(),error.getField(),error.getDefaultMessage()))
+                .collect(Collectors.toList());
+
+        return Response.error("参数不合法",fieldErrors);
+    }
+
+    // 处理单个参数校验失败
+    @ExceptionHandler(ConstraintViolationException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public Response<List<FieldError>> handleConstraintViolation(ConstraintViolationException ex) {
+        List<FieldError> fieldErrors = ex.getConstraintViolations()
+                .stream()
+                .map(violation -> new FieldError(null,violation.getPropertyPath().toString(),violation.getMessage()))
+                .collect(Collectors.toList());
+
+        return Response.error("参数不合法",fieldErrors);
+    }
+
+    // 处理 @Validated 分组校验异常
+    @ExceptionHandler(BindException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public Response<List<FieldError>> handleBindException(BindException ex) {
+        List<FieldError> fieldErrors = ex.getFieldErrors()
+                .stream()
+                .map(error -> new FieldError( error.getObjectName(),error.getField(), error.getDefaultMessage()))
+                .collect(Collectors.toList());
+
+        return Response.error("参数不合法",fieldErrors);
+    }
+
+    @ExceptionHandler(Exception.class)
+    public Response handlerException(Exception e){
+        return Response.error(e.getMessage());
+    }
+}

+ 5 - 4
src/main/java/space/anyi/serve/service/impl/UserServiceImpl.java

@@ -43,10 +43,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements Use
     @Override
     public Page<User> queryByPage(User user,Page<User> page) {
         LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>()
-                .eq(Objects.nonNull(user.getRole()),User::getRole,user.getRole())
-                .eq(Objects.nonNull(user.getAccount()),User::getAccount,user.getAccount())
-                .eq(Objects.nonNull(user.getEnable()),User::getEnable,user.getEnable())
-                .like(Objects.nonNull(user.getUsername()), User::getUsername, user.getUsername());
+                .eq(!user.getRole().isEmpty(),User::getRole,user.getRole())
+                .eq(!user.getAccount().isEmpty(),User::getAccount,user.getAccount())
+                .eq(User::getEnable,user.getEnable())
+                .like(!user.getUsername().isEmpty(), User::getUsername, user.getUsername())
+                .orderByAsc(User::getId);
         page(page, lambdaQueryWrapper);
         return page;
     }