Spring Boot3升级后HttpStatus转HttpStatusCode的正确判断方式
Spring Boot 3升级后HttpStatus与HttpStatusCode判断的正确方式
问题场景
Spring Boot 2升级到3后,原有基于HttpStatus的判断代码出现类型不匹配错误(Required type: HttpStatus,Provided: HttpStatusCode),相关代码如下:
原Spring Boot 2代码
import org.springframework.http.HttpStatus; HttpStatus statusCode; if (statusCode == HttpStatus.BAD_REQUEST){ // 业务逻辑 }
升级后的尝试代码
import org.springframework.http.HttpStatusCode; HttpStatusCode statusCode; if (statusCode == HttpStatusCode.valueOf(400)){ // 业务逻辑 }
正确实现方式
方式1:利用HttpStatus枚举匹配(推荐)
HttpStatus是HttpStatusCode的子类,推荐使用以下两种可靠方式:
- equals方法匹配:兼容所有
HttpStatusCode的实现类,无需担心实例类型import org.springframework.http.HttpStatusCode; import org.springframework.http.HttpStatus; HttpStatusCode statusCode; if (HttpStatus.BAD_REQUEST.equals(statusCode)) { // 执行业务逻辑 } - 强转后用==匹配:如果能确定
statusCode实际是HttpStatus枚举实例,可强转后用==(枚举的==是引用比较,性能略优)import org.springframework.http.HttpStatusCode; import org.springframework.http.HttpStatus; HttpStatusCode statusCode; if (statusCode instanceof HttpStatus && (HttpStatus) statusCode == HttpStatus.BAD_REQUEST) { // 执行业务逻辑 }
方式2:通过状态码数值判断
如果只关注状态码的数值,可直接获取数值后比较:
import org.springframework.http.HttpStatusCode; HttpStatusCode statusCode; if (statusCode.value() == 400) { // 执行业务逻辑 }
不推荐的方式说明
不要直接用HttpStatusCode.valueOf(400)和==比较,因为HttpStatusCode.valueOf(400)返回的是通用HttpStatusCode实例,而业务中拿到的statusCode大概率是HttpStatus枚举对象,二者是不同实例,==比较会返回false,导致判断逻辑失效。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

