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

Spring Boot控制器错误状态下如何返回不同类型的响应

解决方案

你可以通过以下几种常用方式重构代码解决类型不兼容问题:


方案1:使用泛型通配符

直接将方法返回值声明为ResponseEntity<*>,可以兼容任意类型的响应体,修改后代码如下:

@PostMapping("/generate/send")
fun handleRequest( @RequestHeader(required = false) header1: String?,
                    @RequestHeader(required = false) header2: String?): ResponseEntity<*> {
     
    if(header1 == null && header2 == null) { 
        return ResponseEntity(ErrorResponse("请求头不能为空"), HttpStatus.BAD_REQUEST )
    }
    return ResponseEntity(Customer(), HttpStatus.OK )
}

注意:这里需要把@RequestHeader的required属性设为false,同时将参数类型声明为可空类型String?,否则请求头缺失时Spring会直接返回400错误,不会进入你的业务判断逻辑。


方案2:使用全局异常处理器(更符合REST规范,推荐)

把错误场景的逻辑改为抛出自定义异常,通过@RestControllerAdvice统一捕获处理,不需要修改原有接口的返回类型:

第一步:定义自定义异常

class InvalidRequestException(msg: String) : RuntimeException(msg)

第二步:编写全局异常处理器

@RestControllerAdvice
class GlobalExceptionHandler {
    @ExceptionHandler(InvalidRequestException::class)
    fun handleInvalidRequest(e: InvalidRequestException): ResponseEntity<ErrorResponse> {
        return ResponseEntity(ErrorResponse(e.message), HttpStatus.BAD_REQUEST)
    }
}

第三步:修改控制器逻辑

@PostMapping("/generate/send")
fun handleRequest( @RequestHeader(required = false) header1: String?,
                    @RequestHeader(required = false) header2: String?): ResponseEntity<Customer> {
     
    if(header1 == null && header2 == null) { 
        throw InvalidRequestException("两个请求头不能同时为空")
    }
    return ResponseEntity(Customer(), HttpStatus.OK )
}

这种方式可以把所有错误处理逻辑从控制器中抽离,代码更整洁,也便于统一管理所有接口的错误响应格式。


方案3:定义统一响应包装类

定义一个通用的外层响应结构,不管成功失败都用同一个类承载,示例如下:

data class CommonResponse<T>(
    val success: Boolean,
    val data: T? = null,
    val errorMsg: String? = null
)

控制器返回值改为ResponseEntity<CommonResponse<*>>,成功时填充data字段,失败时填充errorMsg字段即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 23:00:00