From 54c2581e088d12beed1085e0972df23c798d25f6 Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Mon, 7 Jul 2025 14:16:52 +0800 Subject: [PATCH] =?UTF-8?q?:construction:=20=E8=AE=BE=E7=BD=AE=E5=88=86?= =?UTF-8?q?=E7=BB=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mall-common/pom.xml | 4 + .../mall/common/domain/dto/package-info.java | 1 + .../domain/dto/valid/ValidationGroups.java | 15 +++ .../exception/GlobalExceptionHandler.java | 95 +++++++++++++++++++ .../mall/common/exception/MallException.java | 40 ++++++++ .../product/controller/BrandController.java | 4 +- .../com/mall/product/domain/dto/BrandDto.java | 7 ++ mall-services/mall-third-party/pom.xml | 20 ---- .../thirdParty/MallThirdPartyApplication.java | 3 +- 9 files changed, 167 insertions(+), 22 deletions(-) create mode 100644 mall-common/src/main/java/com/mall/common/domain/dto/package-info.java create mode 100644 mall-common/src/main/java/com/mall/common/domain/dto/valid/ValidationGroups.java create mode 100644 mall-common/src/main/java/com/mall/common/exception/GlobalExceptionHandler.java create mode 100644 mall-common/src/main/java/com/mall/common/exception/MallException.java diff --git a/mall-common/pom.xml b/mall-common/pom.xml index 90947f1..b767571 100644 --- a/mall-common/pom.xml +++ b/mall-common/pom.xml @@ -23,6 +23,10 @@ org.projectlombok lombok + + org.springframework.boot + spring-boot-starter-validation + diff --git a/mall-common/src/main/java/com/mall/common/domain/dto/package-info.java b/mall-common/src/main/java/com/mall/common/domain/dto/package-info.java new file mode 100644 index 0000000..22b8a1d --- /dev/null +++ b/mall-common/src/main/java/com/mall/common/domain/dto/package-info.java @@ -0,0 +1 @@ +package com.mall.common.domain.dto; \ No newline at end of file diff --git a/mall-common/src/main/java/com/mall/common/domain/dto/valid/ValidationGroups.java b/mall-common/src/main/java/com/mall/common/domain/dto/valid/ValidationGroups.java new file mode 100644 index 0000000..bb05fc6 --- /dev/null +++ b/mall-common/src/main/java/com/mall/common/domain/dto/valid/ValidationGroups.java @@ -0,0 +1,15 @@ +package com.mall.common.domain.dto.valid; + +public interface ValidationGroups { + interface QUERY { + } + + interface Add { + } + + interface Update { + } + + interface DELETE { + } +} \ No newline at end of file diff --git a/mall-common/src/main/java/com/mall/common/exception/GlobalExceptionHandler.java b/mall-common/src/main/java/com/mall/common/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..38088e6 --- /dev/null +++ b/mall-common/src/main/java/com/mall/common/exception/GlobalExceptionHandler.java @@ -0,0 +1,95 @@ +package com.mall.common.exception; + +import com.mall.common.domain.vo.result.Result; +import com.mall.common.domain.vo.result.ResultCodeEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.sql.SQLIntegrityConstraintViolationException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + @ExceptionHandler(MallException.class) + @ResponseBody + public Result exceptionHandler(MallException exception) { + String message = exception.getMessage(); + Integer code = exception.getCode(); + return Result.error(null, code, message); + } + + @ExceptionHandler(RuntimeException.class) + @ResponseBody + public Result exceptionHandler(RuntimeException exception) { + String message = exception.getMessage(); + message = StringUtils.hasText(message) ? message : "服务器异常"; + exception.printStackTrace(); + + // 解析异常 + String jsonParseError = "JSON parse error (.*)"; + Matcher jsonParseErrorMatcher = Pattern.compile(jsonParseError).matcher(message); + if (jsonParseErrorMatcher.find()) { + return Result.error(null, 500, "JSON解析异常 " + jsonParseErrorMatcher.group(1)); + } + + // 数据过大 + String dataTooLongError = "Data too long for column (.*?) at row 1"; + Matcher dataTooLongErrorMatcher = Pattern.compile(dataTooLongError).matcher(message); + if (dataTooLongErrorMatcher.find()) { + return Result.error(null, 500, dataTooLongErrorMatcher.group(1) + " 字段数据过大"); + } + + // 主键冲突 + String primaryKeyError = "Duplicate entry '(.*?)' for key .*"; + Matcher primaryKeyErrorMatcher = Pattern.compile(primaryKeyError).matcher(message); + if (primaryKeyErrorMatcher.find()) { + return Result.error(null, 500, "[" + primaryKeyErrorMatcher.group(1) + "]已存在"); + } + + log.error("GlobalExceptionHandler===>运行时异常信息:{}", message); + return Result.error(null, 500, message); + } + + // 表单验证字段 + @ExceptionHandler(MethodArgumentNotValidException.class) + public Result handleValidationExceptions(MethodArgumentNotValidException ex) { + String errorMessage = ex.getBindingResult().getFieldErrors().stream() + .map(DefaultMessageSourceResolvable::getDefaultMessage) + .distinct() + .collect(Collectors.joining(", ")); + return Result.error(null, 201, errorMessage); + } + + // 特定异常处理 + @ExceptionHandler(ArithmeticException.class) + @ResponseBody + public Result error(ArithmeticException exception) { + log.error("GlobalExceptionHandler===>特定异常信息:{}", exception.getMessage()); + + return Result.error(null, 500, exception.getMessage()); + } + + // 处理SQL异常 + @ExceptionHandler(SQLIntegrityConstraintViolationException.class) + @ResponseBody + public Result exceptionHandler(SQLIntegrityConstraintViolationException exception) { + log.error("GlobalExceptionHandler===>处理SQL异常:{}", exception.getMessage()); + + String message = exception.getMessage(); + if (message.contains("Duplicate entry")) { + // 错误信息 + return Result.error(ResultCodeEnum.USER_IS_EMPTY); + } else { + return Result.error(ResultCodeEnum.UNKNOWN_EXCEPTION); + } + } +} diff --git a/mall-common/src/main/java/com/mall/common/exception/MallException.java b/mall-common/src/main/java/com/mall/common/exception/MallException.java new file mode 100644 index 0000000..c290429 --- /dev/null +++ b/mall-common/src/main/java/com/mall/common/exception/MallException.java @@ -0,0 +1,40 @@ +package com.mall.common.exception; + +import com.mall.common.domain.vo.result.ResultCodeEnum; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@NoArgsConstructor +@Getter +@ToString +@Slf4j +public class MallException extends RuntimeException { + private Integer code; + private String message; + + public MallException(Integer code, String message) { + super(message); + this.code = code; + this.message = message; + } + + public MallException(String message) { + super(message); + this.message = message; + } + + public MallException(ResultCodeEnum codeEnum) { + super(codeEnum.getMessage()); + this.code = codeEnum.getCode(); + this.message = codeEnum.getMessage(); + } + + public MallException(String message, Exception exception) { + super(message); + this.message = message; + log.error(message, exception); + } + +} diff --git a/mall-services/mall-product/src/main/java/com/mall/product/controller/BrandController.java b/mall-services/mall-product/src/main/java/com/mall/product/controller/BrandController.java index bd1b6e5..1f44ccf 100644 --- a/mall-services/mall-product/src/main/java/com/mall/product/controller/BrandController.java +++ b/mall-services/mall-product/src/main/java/com/mall/product/controller/BrandController.java @@ -1,6 +1,7 @@ package com.mall.product.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mall.common.domain.dto.valid.ValidationGroups; import com.mall.common.domain.vo.result.PageResult; import com.mall.common.domain.vo.result.Result; import com.mall.common.domain.vo.result.ResultCodeEnum; @@ -13,6 +14,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -55,7 +57,7 @@ public class BrandController { @Operation(summary = "更新品牌", description = "更新品牌") @PutMapping() - public Result updateBrand(@Valid @RequestBody BrandDto dto) { + public Result updateBrand(@Validated(ValidationGroups.Update.class) @RequestBody BrandDto dto) { brandService.updateBrand(dto); return Result.success(ResultCodeEnum.UPDATE_SUCCESS); } diff --git a/mall-services/mall-product/src/main/java/com/mall/product/domain/dto/BrandDto.java b/mall-services/mall-product/src/main/java/com/mall/product/domain/dto/BrandDto.java index 6dc8a44..bd5e707 100644 --- a/mall-services/mall-product/src/main/java/com/mall/product/domain/dto/BrandDto.java +++ b/mall-services/mall-product/src/main/java/com/mall/product/domain/dto/BrandDto.java @@ -1,10 +1,14 @@ package com.mall.product.domain.dto; +import com.mall.common.domain.dto.valid.ValidationGroups; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.URL; @Data @AllArgsConstructor @@ -14,12 +18,15 @@ import lombok.NoArgsConstructor; public class BrandDto { @Schema(name = "brandId", title = "品牌id") + @NotNull(message = "品牌id未传", groups = {ValidationGroups.Update.class, ValidationGroups.DELETE.class}) private Long brandId; @Schema(name = "name", title = "品牌名") + @NotBlank(message = "品牌名不能为空", groups = ValidationGroups.Update.class) private String name; @Schema(name = "logo", title = "品牌logo地址") + @URL(message = "logo地址不合法") private String logo; @Schema(name = "descript", title = "介绍") diff --git a/mall-services/mall-third-party/pom.xml b/mall-services/mall-third-party/pom.xml index bf5b8a0..802c300 100644 --- a/mall-services/mall-third-party/pom.xml +++ b/mall-services/mall-third-party/pom.xml @@ -18,26 +18,6 @@ - - com.mall - mall-common - 1.0-SNAPSHOT - - - com.baomidou - mybatis-plus-boot-starter - - - com.mysql - mysql-connector-j - - - com.zaxxer - HikariCP - - - - org.springframework.boot diff --git a/mall-services/mall-third-party/src/main/java/com/mall/thirdParty/MallThirdPartyApplication.java b/mall-services/mall-third-party/src/main/java/com/mall/thirdParty/MallThirdPartyApplication.java index 5f08255..cf8e566 100644 --- a/mall-services/mall-third-party/src/main/java/com/mall/thirdParty/MallThirdPartyApplication.java +++ b/mall-services/mall-third-party/src/main/java/com/mall/thirdParty/MallThirdPartyApplication.java @@ -2,12 +2,13 @@ package com.mall.thirdParty; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.context.config.annotation.RefreshScope; @EnableDiscoveryClient @RefreshScope -@SpringBootApplication() +@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) public class MallThirdPartyApplication { public static void main(String[] args) { SpringApplication.run(MallThirdPartyApplication.class, args);