能否将现有Java类纳入Kotlin密封接口?Spring HttpStatus适配问题
让Spring HttpStatus实现自定义密封接口Error的方案
首先明确:Spring自带的org.springframework.http.HttpStatus是外部框架类,我们没法直接修改源码让它实现自定义的Error密封接口。不过可以通过以下两种方案实现统一管理:
方案1:创建包装类(推荐)
枚举式包装(适合固定使用部分HttpStatus的场景)
创建一个实现Error接口的枚举,把需要用到的HttpStatus枚举值包装进去:
enum class WrappedHttpStatus(val httpStatus: HttpStatus) : Error { NOT_FOUND(HttpStatus.NOT_FOUND), BAD_REQUEST(HttpStatus.BAD_REQUEST), INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR) // 按需添加其他需要的HttpStatus }
这样WrappedHttpStatus和自定义的ErrorStatus都属于Error类型,能统一进行处理。
通用类包装(适合需要任意HttpStatus的场景)
如果需要灵活支持所有HttpStatus,用普通数据类包装即可:
data class HttpStatusError(val httpStatus: HttpStatus) : Error
使用时直接把目标HttpStatus传入:HttpStatusError(HttpStatus.NOT_FOUND),就能得到一个Error实例。
方案2:扩展函数简化包装
可以在Error接口的伴生对象里添加扩展方法,快速将HttpStatus转为Error类型,本质还是基于包装类:
sealed interface Error { companion object { // 扩展HttpStatus,添加转Error的方法 fun HttpStatus.toError(): Error = HttpStatusError(this) } } data class HttpStatusError(val httpStatus: HttpStatus) : Error
使用时直接调用:HttpStatus.BAD_REQUEST.toError(),就能得到对应的Error实例。
以上方案都能实现把HttpStatus和自定义ErrorStatus统一到Error接口体系下,根据实际场景选择即可。
内容的提问来源于stack exchange,提问作者hc0re
相关产品推荐
相关产品推荐

