看同事在对外提供的 RPC 接口中都用了 Object 返回值而非具体业务类,显然这说不过去。问了才知道是因为 AOP 切面不好改变返回值的类型。她想所有接口返回业务类对象,再统一对外包装成 RPCResult。听起来很好,所以就帮她彻底解决这个问题。
在 Spring 中有 ResponseBodyAdvice,HandlerInterceptor,这些扩展而非更重的 AOP 或代理来完成业务结果的 Rewrite。这样的设计也帮助证明一点,我们可以把对外的接口,按照非 Result 包装的定义方式,在切面上实现异常的统一处理,结果对象的统一封装。这也是关注点分离的最好体现。其实除了 HTTP,像 RPC ,Dubbo 应该都有对应的 Filter 优雅实现,减少不一致和各种模版代码的出现。接口的协议格式和 Payload 可以分别处理。