Ver código fonte

实现 Validated, 封装统一请求参数

Gaokun Wang 1 mês atrás
pai
commit
0dae3eb2bb

+ 8 - 0
eco-bom/pom.xml

@@ -26,6 +26,7 @@
         <hutool-5.version>5.8.36</hutool-5.version>
         <easy-trans.version>3.0.6</easy-trans.version>
         <jackson.version>2.18.3</jackson.version>
+        <jakarta.version>6.1.0</jakarta.version>
         <easy-trans.version>3.0.6</easy-trans.version>
         <deepseek4j.version>1.4.5</deepseek4j.version>
         <milvus.version>2.5.5</milvus.version>
@@ -46,6 +47,13 @@
                 <scope>import</scope>
             </dependency>
 
+            <!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
+            <dependency>
+                <groupId>jakarta.servlet</groupId>
+                <artifactId>jakarta.servlet-api</artifactId>
+                <version>${jakarta.version}</version>
+            </dependency>
+
             <!-- com-web -->
             <dependency>
                 <groupId>org.eco.vip</groupId>

+ 4 - 0
eco-common/com-core/pom.xml

@@ -51,5 +51,9 @@
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 6 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/pojo/CommonResult.java

@@ -66,6 +66,12 @@ public class CommonResult<T> implements Serializable {
         result.msg = message;
         return result;
     }
+    public static <T> CommonResult<T> fail( String message) {
+        CommonResult<T> result = new CommonResult<>();
+        result.code = GlobalErrorCode.INTERNAL_SERVER_ERROR.getCode();
+        result.msg = message;
+        return result;
+    }
 
     public static <T> CommonResult<T> fail(ErrorCode errorCode) {
         return fail(errorCode.getCode(), errorCode.getMsg());

+ 87 - 0
eco-common/com-web/src/main/java/org/eco/vip/web/config/core/handler/GlobalExceptionHandler.java

@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.web.config.core.handler;
+
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.vip.orm.exception.BusinessException;
+import org.eco.vip.orm.exception.enums.GlobalErrorCode;
+import org.eco.vip.orm.pojo.CommonResult;
+import org.springframework.validation.FieldError;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @description GlobalExceptionHandler 全局异常处理器
+ *
+ * @author GaoKunW
+ * @date 2025/7/1 15:24
+ */
+@RestControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+    public CommonResult<Void> allExceptionHandler(HttpServletRequest request, Throwable throwable) {
+        if (throwable instanceof MethodArgumentNotValidException) {
+            return handleMethodArgumentNotValidException((MethodArgumentNotValidException) throwable);
+        }
+
+        return defaultExceptionHandler(request, throwable);
+    }
+
+    /**
+     * 业务异常
+     */
+    @ExceptionHandler(BusinessException.class)
+    public CommonResult<Void> handleServiceException(BusinessException e, HttpServletRequest request) {
+        log.error(e.getMessage());
+        Integer code = e.getCode();
+        return ObjectUtil.isNotNull(code) ? CommonResult.fail(code, e.getMessage()) : CommonResult.fail(e.getMessage());
+    }
+
+    /**
+     * 自定义Valid验证异常
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public CommonResult<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) {
+        log.warn("[handleMethodArgumentNotValidException]", exception);
+        String errorMessage = null;
+        FieldError fieldError = exception.getBindingResult().getFieldError();
+        if (ObjectUtil.isNull(fieldError)) {
+            List<ObjectError> allErrors = exception.getBindingResult().getAllErrors();
+            if(CollUtil.isNotEmpty(allErrors)) {
+                errorMessage = allErrors.getFirst().getDefaultMessage();
+            }
+        }else  {
+            errorMessage = fieldError.getDefaultMessage();
+        }
+        if (StrUtil.isEmpty(errorMessage)) {
+            return CommonResult.fail(GlobalErrorCode.BAD_REQUEST);
+        }
+        return CommonResult.fail(GlobalErrorCode.BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", errorMessage));
+    }
+
+    /**
+     * 系统异常
+     */
+    @ExceptionHandler(Exception.class)
+    public CommonResult<Void> defaultExceptionHandler(HttpServletRequest request, Throwable throwable) {
+        String requestUri = request.getRequestURI();
+        String message = ExceptionUtil.getRootCauseMessage(throwable);
+        log.error("请求地址'{}',发生系统异常.{}", requestUri, message);
+        return CommonResult.fail(message);
+    }
+}

+ 5 - 1
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/auth/AuthController.java

@@ -7,8 +7,11 @@ package org.eco.vip.auth.controller.auth;
 
 
 import jakarta.annotation.security.PermitAll;
+import jakarta.validation.Valid;
 import org.eco.vip.auth.domain.auth.vo.AuthParam;
+import org.eco.vip.orm.exception.BusinessException;
 import org.eco.vip.orm.pojo.CommonResult;
+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.RequestMapping;
@@ -24,11 +27,12 @@ import static org.eco.vip.orm.pojo.CommonResult.success;
  */
 @RestController
 @RequestMapping("/system/auth")
+@Validated
 public class AuthController {
 
     @PostMapping("/login")
     @PermitAll
-    public CommonResult<String> login(@RequestBody AuthParam authParam) {
+    public CommonResult<String> login(@RequestBody @Valid AuthParam authParam) {
         return success("登录成功");
     }
 }

+ 2 - 2
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/auth/vo/AuthParam.java

@@ -6,7 +6,7 @@
 package org.eco.vip.auth.domain.auth.vo;
 
 
-import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotBlank;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -27,7 +27,7 @@ public class AuthParam {
     /**
      * 账号
      */
-    @NotEmpty(message = "账号不能为空", groups = CodeEnableGroup.class)
+    @NotBlank(message = "账号不能为空")
     private String account;
     /**
      * 密码