前端

后端代码:不用@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}&gt
     */
    @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 级别的默认校验

四、使用建议

  1. 如果您确实需要对简单类型参数进行校验

    • 推荐升级异常处理器,捕获 HandlerMethodValidationException 并友好返回。

    • 或者保持使用 @Validated 在 Controller 类上(即使 Spring 6.1 也兼容),此时仍会抛出 ConstraintViolationException,但您需要自己保证已配置 MethodValidationPostProcessor(Spring Boot 自动配置了)。

  2. 如果您更习惯传统方式

    • 可以在类上加 @Validated,方法参数继续使用 @NotBlank 等,此时失败仍抛出 ConstraintViolationException(需配置全局捕获)。

    • 或者完全依赖 JavaBean + @Valid,走 MethodArgumentNotValidException

  3. 注意版本: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服务器错误状态码
        );
    }

}

前端:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐