Spring @RestController中ResponseEntity两种写法的区别及推荐写法
两种ResponseEntity写法的差异及选型建议
核心差异
两种写法底层生成的ResponseEntity实例完全等价,链式API本质是Spring官方对构造方法做的上层封装,最终还是会调用构造方法实例化对象,两者主要差异在使用层面:
- 可读性不同
链式写法语义非常直观,不需要记忆构造方法的参数顺序,基本是写代码的时候想到什么加什么,不会出现把body、headers、状态码三个参数写反的低级错误。尤其是返回异常状态码的时候,ResponseEntity.notFound().build()比new ResponseEntity<>(HttpStatus.NOT_FOUND)可读性高很多。 - 灵活性不同
链式写法更适合动态组装响应的场景,你可以先拿到Builder实例,根据业务逻辑动态加header、调整状态码、判断是否返回body,不需要提前把所有参数都准备好。示例场景:
这种场景如果用构造方法实现,你需要提前声明多个变量存储不同的参数,代码会冗余很多。ResponseEntity.BodyBuilder builder = ResponseEntity.status(HttpStatus.OK); // 动态添加header if (needAuthHeader) { builder.header("Authorization", generateToken()); } // 动态判断是否返回body if (user == null) { return builder.build(); } return builder.body(user); - 版本兼容性不同
链式API是Spring 4.1版本才新增的能力,如果你的项目是维护非常老的遗留系统,Spring版本低于4.1,就只能用构造方法实现,目前绝大多数项目都不会碰到这个限制。
实际开发推荐
优先选择链式写法:
- 代码更简洁易读,出错概率低,是目前Spring官方文档主推的写法
- 动态调整响应内容的时候代码扩展性更好,后续加header、改状态码的改造成本很低
只有当你需要兼容低于4.1的Spring版本时,再选择构造方法写法。
内容的提问来源于stack exchange,提问作者Jen
相关产品推荐
相关产品推荐

