You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot RESTful接口遇CustomException返回错误JSON而非Bean映射问题

解决Spring Boot REST服务中员工ID不匹配时返回自定义错误JSON的问题

看样子你现在的核心困扰是:员工ID不匹配时Spring Boot没返回预期的错误JSON,反而给了空响应;同时希望触发自定义异常时,也能返回指定格式的错误响应而非默认的Bean映射JSON。下面给你一步步梳理解决方案:

1. 先创建专属的自定义异常类

我们需要一个专门标识「员工未找到」场景的异常,这样后续能精准捕获并处理它:

public class EmployeeNotFoundException extends RuntimeException {
    private final String empId;

    public EmployeeNotFoundException(String empId) {
        super("Employee not found for empId " + empId);
        this.empId = empId;
    }

    public String getEmpId() {
        return empId;
    }
}

2. 实现全局异常处理器

用Spring的@RestControllerAdvice打造全局异常处理器,捕获刚才的自定义异常,直接返回你要的错误JSON格式:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(EmployeeNotFoundException.class)
    public ResponseEntity<Map<String, String>> handleEmployeeNotFound(EmployeeNotFoundException ex) {
        Map<String, String> errorResponse = new HashMap<>();
        errorResponse.put("Error", "Employee not found for empId " + ex.getEmpId());
        // 附带404状态码,更贴合「资源未找到」的语义
        return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
    }
}

Spring会自动把这个Map转换成你需要的JSON格式,不用手动拼接字符串。

3. 修改业务逻辑,抛出自定义异常

在你的Controller或业务方法里,当查不到匹配的员工时,别再返回null或者空对象了,直接抛出我们定义的异常:

@GetMapping("/employees/{empId}")
public ResponseEntity<EmployeeResponseData> getEmployee(@PathVariable String empId) {
    EmployeeResponseData employee = employeeService.getEmployeeById(empId);
    if (employee == null) {
        // 抛异常交给全局处理器处理,替代返回null的逻辑
        throw new EmployeeNotFoundException(empId);
    }
    return ResponseEntity.ok(employee);
}

为啥之前会返回空响应?

你之前遇到的空响应,大概率是因为找不到员工时代码返回了null,Spring Boot处理返回null的ResponseEntity时,默认会生成空的响应体。通过抛出异常让全局处理器接管,我们就能主动控制返回的内容和状态码。

额外:处理其他自定义异常的扩展

如果还有其他自定义异常需要返回类似格式的错误响应,只需要在GlobalExceptionHandler里新增对应的@ExceptionHandler方法就行,比如:

@ExceptionHandler(InvalidRequestException.class)
public ResponseEntity<Map<String, String>> handleInvalidRequest(InvalidRequestException ex) {
    Map<String, String> errorResponse = new HashMap<>();
    errorResponse.put("Error", ex.getMessage());
    return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}

这样所有自定义异常都能按你想要的格式返回错误JSON,不会再出现默认的Bean映射响应了。

内容的提问来源于stack exchange,提问作者prnjn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:46:07