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
相关产品推荐
相关产品推荐

