业务直接把真正的 body 放在 ResponseEntity 中, 设置好非 2xx 的状态码返回, 遇到 ClassCastException, 因为Java-Chassis假设body是InvocationException类型的, 直接做了转换, 关键代码位置在org.apache.servicecomb.common.rest.filter.inner.ServerRestArgsFilter#beforeSendResponseAsync:
@Override
public CompletableFuture<Void> beforeSendResponseAsync(Invocation invocation, HttpServletResponseEx responseEx) {
Response response = (Response) responseEx.getAttribute(RestConst.INVOCATION_HANDLER_RESPONSE);
ProduceProcessor produceProcessor =
(ProduceProcessor) responseEx.getAttribute(RestConst.INVOCATION_HANDLER_PROCESSOR);
Object body = response.getResult();
if (response.isFailed()) {
body = ((InvocationException) body).getErrorData(); // 这里直接强转了 InvocationException 类型
}
这个算是业务比较常见的开发错误, 对于我们来说答疑的成本高, 但Java-Chassis的优化成本应该不高, 能否做一个自动适配的逻辑呢?