校验异常处理:c.w.exception.GlobalExceptionHandler : 异常错误: 400 BAD_REQUEST “Validation failure
您日志中的异常是Spring 6.1 新引入的统一 Controller 参数校验异常。它代表直接在方法参数上定义的约束校验失败。只需在全局异常处理器中添加即可正常处理。
前端





后端代码:不用@Validated
package com.weiyu.controller;
import com.weiyu.model.CapitalAllocateCreateDTO;
import com.weiyu.model.CapitalAllocateDetailVO;
import com.weiyu.model.Result;
import com.weiyu.service.CapitalAllocateService;
import com.weiyu.util.SecurityUtils;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 资金分配控制器
*/
@RestController
@RequestMapping("/capital/allocate")
@RequiredArgsConstructor
@Slf4j
public class CapitalAllocateController {
private final CapitalAllocateService allocateService;
/**
* 生成资金分派工作流程
*
* @param capitalId 资金信息id
* @param createDTOs 资金分配明细列表
* @return {@link Result}<{@link Void}>
*/
@PostMapping("/generate-workflow/{capitalId}")
public Result<Void> generateWorkflow(
@PathVariable @Min(value = 1, message = "资金信息id不能小于1") Integer capitalId,
@RequestBody @Valid List<CapitalAllocateCreateDTO> createDTOs
) {
String endpoint = "/capital/allocate/generate-workflow/";
String method = "generateWorkflow";
log.info("【资金分配】生成资金分配工作流程,{}{},{},createDTOs = {}",
endpoint, capitalId, method, SecurityUtils.safeForLog(createDTOs));
try {
allocateService.generateWorkflow(capitalId, createDTOs);
return Result.success();
} catch (Exception e) {
log.error("【资金分配】生成资金分配工作流程失败,{},{}", endpoint, method, e);
return Result.error("生成资金分配工作流程失败");
}
}
}
后端异常堆栈信息:
c.w.exception.GlobalExceptionHandler : 异常错误: 400 BAD_REQUEST "Validation failure
2026-02-12T11:09:07.106+08:00 ERROR 39168 --- [nio-8080-exec-4] c.w.exception.GlobalExceptionHandler : 异常错误: 400 BAD_REQUEST "Validation failure"
org.springframework.web.method.annotation.HandlerMethodValidationException: 400 BAD_REQUEST "Validation failure"
at org.springframework.web.method.annotation.HandlerMethodValidator.applyArgumentValidation(HandlerMethodValidator.java:106) ~[spring-web-6.1.15.jar:6.1.15]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:184) ~[spring-web-6.1.15.jar:6.1.15]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.15.jar:6.1.15]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.15.jar:6.1.15]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.15.jar:6.1.15]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.15.jar:6.1.15]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.15.jar:6.1.15]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.15.jar:6.1.15]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.15.jar:6.1.15]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) ~[spring-webmvc-6.1.15.jar:6.1.15]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) ~[tomcat-embed-core-10.1.33.jar:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.15.jar:6.1.15]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.33.jar:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.15.jar:6.1.15]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.15.jar:6.1.15]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.15.jar:6.1.15]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.15.jar:6.1.15]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.15.jar:6.1.15]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.15.jar:6.1.15]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.33.jar:10.1.33]
at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]
您遇到的异常是 HandlerMethodValidationException,这是 Spring 6.1+(Spring Boot 3.2+) 引入的统一验证异常类型,专门用于处理 Controller 方法参数/返回值 的校验失败场景。
一、这是什么异常?
-
异常类:
org.springframework.web.method.annotation.HandlerMethodValidationException -
状态码:
400 BAD_REQUEST -
来源:Spring Web 模块,取代了过去分散的
MethodArgumentNotValidException(@RequestBody)、BindException(@ModelAttribute)和ConstraintViolationException(方法参数校验)等,提供了统一的异常封装。 -
触发原因:Controller 方法参数上直接标注了 Bean Validation 约束注解(如
@NotBlank、@NotNull、@Size等),且验证失败。即使没有添加@Valid或@Validated,Spring 6.1 默认也会自动执行校验,失败时抛出此异常。
您的代码可能类似:
java
@RestController
public class TestController {
@GetMapping("/test")
public String test(@NotBlank(message = "name不能为空") String name) {
return "ok";
}
}
当请求参数 name 为空字符串或 null 时,就会抛出 HandlerMethodValidationException。
二、与 @Valid / @Validated 的区别
| 验证触发方式 | 校验对象 | 失败异常 | 是否需要额外注解 |
|---|---|---|---|
| 参数直接标注约束 | Controller 方法参数(如 @RequestParam、@PathVariable、@RequestPart 等) |
HandlerMethodValidationException |
否(Spring 6.1+ 默认开启) |
| @RequestBody / @ModelAttribute + @Valid | JavaBean 对象(及嵌套属性) | MethodArgumentNotValidException(@RequestBody)BindException(@ModelAttribute) |
必须标注 @Valid 或 @Validated |
| @Validated(类级)+ 方法参数标注约束 | Service 层方法参数 | ConstraintViolationException |
必须在类上加 @Validated |
简单来说:
-
Spring 6.1 开始,Controller 方法参数的简单类型校验(直接写
@NotBlank String name)会默认生效,并抛出新的统一异常。 -
传统 JavaBean 校验(如
@RequestBody @Valid UserDto user)仍抛出MethodArgumentNotValidException,行为未变。
三、如何处理这个异常?
因为 HandlerMethodValidationException 不是 MethodArgumentNotValidException 或 ConstraintViolationException,您现有的全局异常处理器如果只捕获后两者,将无法处理此异常,导致默认返回 Spring 内置的 400 错误页面(或您看到的日志)。
解决方案:在 @RestControllerAdvice 中增加对该异常的捕获,并提取详细的错误信息。
java
import org.springframework.web.method.annotation.HandlerMethodValidationException;
import org.springframework.validation.method.ParameterValidationResult;
@RestControllerAdvice
public class GlobalExceptionHandler {
// 捕获 Spring 6.1+ 的参数校验异常
@ExceptionHandler(HandlerMethodValidationException.class)
public ResponseEntity<Map<String, Object>> handleHandlerMethodValidationException(
HandlerMethodValidationException ex) {
List<String> errors = ex.getAllValidationResults().stream()
.map(ParameterValidationResult::getResolvableErrors)
.flatMap(List::stream)
.map(error -> error.getDefaultMessage())
.collect(Collectors.toList());
Map<String, Object> body = new LinkedHashMap<>();
body.put("timestamp", LocalDateTime.now());
body.put("status", 400);
body.put("errors", errors);
return ResponseEntity.badRequest().body(body);
}
}
如果您希望禁用这种默认的参数校验(回到旧版本行为),可以在配置文件中关闭:
yaml
spring:
mvc:
validate-on-execution: false # 关闭 HandlerMethod 级别的默认校验
四、使用建议
-
如果您确实需要对简单类型参数进行校验:
-
推荐升级异常处理器,捕获
HandlerMethodValidationException并友好返回。 -
或者保持使用
@Validated在 Controller 类上(即使 Spring 6.1 也兼容),此时仍会抛出ConstraintViolationException,但您需要自己保证已配置MethodValidationPostProcessor(Spring Boot 自动配置了)。
-
-
如果您更习惯传统方式:
-
可以在类上加
@Validated,方法参数继续使用@NotBlank等,此时失败仍抛出ConstraintViolationException(需配置全局捕获)。 -
或者完全依赖 JavaBean + @Valid,走
MethodArgumentNotValidException。
-
-
注意版本:Spring Boot 3.2(对应 Spring 6.1)开始默认启用此行为,升级时需特别注意全局异常处理器的适配。
五、总结
-
您日志中的异常是 Spring 6.1 新引入的统一 Controller 参数校验异常。
-
它代表直接在方法参数上定义的约束校验失败。
-
只需在全局异常处理器中添加
@ExceptionHandler(HandlerMethodValidationException.class)即可正常处理。
全局异常处理器 src/main/java/com/weiyu/exception/GlobalExceptionHandler.java
import lombok.extern.slf4j.Slf4j; // Lombok日志注解
import org.springframework.web.bind.annotation.ExceptionHandler; // 异常处理器注解
import org.springframework.web.bind.annotation.RestControllerAdvice; // 控制器增强注解
import org.springframework.web.method.annotation.HandlerMethodValidationException;
/**
* 全局异常处理器
* 作用:集中处理整个应用程序中控制器层抛出的异常
*/
@RestControllerAdvice // 组合注解:包含 @ControllerAdvice + @ResponseBody,使返回值自动转为JSON
@SuppressWarnings("unused") // 使用这个注解来抑制警告 或 使用 @Component
@Slf4j
public class GlobalExceptionHandler {
/**
* 处理处理方法验证异常(HandlerMethodValidationException)
*
* @param e 捕获的处理方法验证异常对象
* @return 返回JSON错误信息
*/
@ExceptionHandler(HandlerMethodValidationException.class)
public Object handleHandlerMethodValidationException(HandlerMethodValidationException e) {
return Result.error("通过全局异常处理器捕捉到该异常,处理方法验证失败:" + e.getMessage());
}
/**
* 处理所有其他未明确指定的异常(顶级异常处理器)
* 作用:作为异常处理的兜底方案,确保所有异常都被处理
*/
@ExceptionHandler(Exception.class) // 捕获所有未被处理的异常
public Object handleException(Exception e, HttpServletRequest request) {
// ❌ 禁止使用 printStackTrace 在控制台输出异常的详细堆栈跟踪信息
// e.printStackTrace();
// ✅ 规范日志记录:使用日志框架记录完整异常堆栈(参数 e 包含异常的详细堆栈跟踪信息)
log.error("异常错误: {}", e.getMessage(), e); // 记录错误消息和详细堆栈跟踪信息
// 1. 处理文件下载请求的异常
if (ErrorFileResponseUtils.isFileDownloadRequest(request)) {
// 确保错误消息不为空,使用默认消息兜底
String message = StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "下载文件失败";
// 生成包含错误信息的文件响应,使用500状态码
return ErrorFileResponseUtils.createErrorFileResponse(message, HttpStatus.INTERNAL_SERVER_ERROR);
}
// 2. 普通请求的异常处理
return Result.error(
StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "操作失败", // 消息处理
500 // 统一返回500服务器错误状态码
);
}
}
前端:





请完善这里的全局异常处理:
/**
* 处理处理方法验证异常(HandlerMethodValidationException)
*
* @param e 捕获的处理方法验证异常对象
* @return 返回JSON错误信息
*/
@ExceptionHandler(HandlerMethodValidationException.class)
public Object handleHandlerMethodValidationException(HandlerMethodValidationException e) {
return Result.error("通过全局异常处理器捕捉到该异常,处理方法验证失败:" + e.getMessage());
}
以下是完善后的 HandlerMethodValidationException 全局异常处理方法,它会解析详细的参数/字段验证错误信息,并以结构化列表的形式返回,便于前端定位问题。
java
import org.springframework.validation.FieldError;
import org.springframework.web.method.annotation.HandlerMethodValidationException;
import org.springframework.validation.method.ParameterValidationResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.List;
import java.util.stream.Collectors;
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理 Spring 6.1+ 统一方法参数验证异常(HandlerMethodValidationException)
* 包括:@RequestParam、@PathVariable、@RequestBody 等直接标注约束的校验失败
*/
@ExceptionHandler(HandlerMethodValidationException.class)
public Result handleHandlerMethodValidationException(HandlerMethodValidationException e) {
// 提取所有参数验证失败的具体错误信息
List<String> errorDetails = e.getAllValidationResults().stream()
.flatMap(validationResult -> {
// 获取参数名(如果没有则使用参数位置索引)
String paramName = validationResult.getMethodParameter().getParameterName();
if (paramName == null) {
paramName = "arg" + validationResult.getMethodParameter().getParameterIndex();
}
// 将该参数上的所有错误消息转换为字符串(支持字段级和参数级)
List<String> paramErrors = validationResult.getResolvableErrors().stream()
.map(error -> {
if (error instanceof FieldError fieldError) {
// 字段错误:参数名.字段路径 : 错误消息
return paramName + "." + fieldError.getField() + ": " + fieldError.getDefaultMessage();
} else {
// 参数对象整体错误(如 @ScriptAssert、@Valid 嵌套对象的类级别注解)
return paramName + ": " + error.getDefaultMessage();
}
})
.collect(Collectors.toList());
return paramErrors.stream();
})
.collect(Collectors.toList());
// 如果解析失败(极少情况),至少返回原始异常信息
if (errorDetails.isEmpty()) {
errorDetails.add(e.getMessage());
}
// 返回统一错误响应,将详细错误列表放入 data 字段
return Result.error("请求参数校验失败", errorDetails);
}
}
改进说明
| 改进点 | 实现方式 |
|---|---|
| 提取所有错误详情 | 使用 getAllValidationResults() 遍历每个参数,getResolvableErrors() 遍历该参数上的每个错误 |
| 支持字段级错误 | 将 FieldError 转换为 参数名.字段路径 : 错误消息 格式 |
| 支持参数级错误 | 非 FieldError(如对象级注解)直接输出 参数名 : 错误消息 |
| 参数名降级处理 | 若未编译保留参数名(-parameters),则用 arg+索引 代替,避免 NPE |
| 降级兜底 | 当解析不出任何错误时,至少返回 e.getMessage() |
| 统一响应结构 | 使用 Result.error("请求参数校验失败", errorDetails),将错误列表置于 data 字段 |
示例响应
json
{
"code": 400,
"msg": "请求参数校验失败",
"data": [
"name: 姓名不能为空",
"age: 年龄必须为正数",
"user.address.city: 城市不能为空"
],
"success": false
}
配套建议
如果您的全局异常处理中同时存在 ConstraintViolationException(类级 @Validated 触发)和 MethodArgumentNotValidException(@RequestBody @Valid 触发),建议也按照类似风格统一处理,保持前端解析一致性。
修改后的代码:
import lombok.extern.slf4j.Slf4j; // Lombok日志注解
import org.springframework.web.bind.annotation.ExceptionHandler; // 异常处理器注解
import org.springframework.web.bind.annotation.RestControllerAdvice; // 控制器增强注解
import org.springframework.web.method.annotation.HandlerMethodValidationException;
/**
* 全局异常处理器
* 作用:集中处理整个应用程序中控制器层抛出的异常
*/
@RestControllerAdvice // 组合注解:包含 @ControllerAdvice + @ResponseBody,使返回值自动转为JSON
@SuppressWarnings("unused") // 使用这个注解来抑制警告 或 使用 @Component
@Slf4j
public class GlobalExceptionHandler {
/**
* 处理 Spring 6.1+ 统一方法参数验证异常(HandlerMethodValidationException)
* 包括:@RequestParam、@PathVariable、@RequestBody 等直接标注约束的校验失败
*
* @param e 捕获的Spring 6.1+ 统一方法参数验证异常对象
* @return 返回JSON错误信息
*/
@ExceptionHandler(HandlerMethodValidationException.class)
public Object handleHandlerMethodValidationException(HandlerMethodValidationException e) {
// 提取所有参数验证失败的具体错误信息
List<String> errorDetails = e.getAllValidationResults().stream()
.flatMap(validationResult -> {
// 获取参数名(如果没有则使用参数位置索引)
String paramName = validationResult.getMethodParameter().getParameterName();
if (paramName == null) {
paramName = "arg" + validationResult.getMethodParameter().getParameterIndex();
}
// 将该参数上的所有错误消息转换为字符串(支持字段级和参数级)
String finalParamName = paramName;
List<String> paramErrors = validationResult.getResolvableErrors().stream()
.map(error -> {
if (error instanceof FieldError fieldError) {
// 字段错误:参数名.字段路径 : 错误消息
return finalParamName + "." + fieldError.getField() + ": " + fieldError.getDefaultMessage();
} else {
// 参数对象整体错误(如 @ScriptAssert、@Valid 嵌套对象的类级别注解)
return finalParamName + ": " + error.getDefaultMessage();
}
})
.toList();
return paramErrors.stream();
})
.collect(Collectors.toList());
// 如果解析失败(极少情况),至少返回原始异常信息
if (errorDetails.isEmpty()) {
errorDetails.add(e.getMessage());
}
// 返回统一错误响应
return Result.error("参数校验失败:" + errorDetails);
}
/**
* 处理所有其他未明确指定的异常(顶级异常处理器)
* 作用:作为异常处理的兜底方案,确保所有异常都被处理
*/
@ExceptionHandler(Exception.class) // 捕获所有未被处理的异常
public Object handleException(Exception e, HttpServletRequest request) {
// ❌ 禁止使用 printStackTrace 在控制台输出异常的详细堆栈跟踪信息
// e.printStackTrace();
// ✅ 规范日志记录:使用日志框架记录完整异常堆栈(参数 e 包含异常的详细堆栈跟踪信息)
log.error("异常错误: {}", e.getMessage(), e); // 记录错误消息和详细堆栈跟踪信息
// 1. 处理文件下载请求的异常
if (ErrorFileResponseUtils.isFileDownloadRequest(request)) {
// 确保错误消息不为空,使用默认消息兜底
String message = StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "下载文件失败";
// 生成包含错误信息的文件响应,使用500状态码
return ErrorFileResponseUtils.createErrorFileResponse(message, HttpStatus.INTERNAL_SERVER_ERROR);
}
// 2. 普通请求的异常处理
return Result.error(
StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "操作失败", // 消息处理
500 // 统一返回500服务器错误状态码
);
}
}
前端:





更多推荐



所有评论(0)