CLOUD-GATEWAY-PooledDataBuffer异常BUG

54 阅读1分钟

对应版本:org.springframework.cloud :Hoxton.SR4

错误形式

{
    "timestamp": "2020-05-25T14:10:30.322+0000",
    "path": "/uc/auth",
    "status": 500,
    "error": "Internal Server Error",
    "message": "java.lang.String cannot be cast to org.springframework.core.io.buffer.DataBuffer",
    "requestId": "7f1d2f1f-14"
}

解决方案

RemoveCachedBodyFilter

  @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return chain.filter(exchange).doFinally(s -> {
            Object v = exchange.getAttributes().remove(CACHED_REQUEST_BODY_ATTR);
            if (v==null) return;
            PooledDataBuffer dataBuffer=null;
            try{
                dataBuffer = (PooledDataBuffer) v;
                if (dataBuffer != null && dataBuffer.isAllocated()) {
                    if (log.isTraceEnabled()) {
                        log.trace("releasing cached body in exchange attribute");
                    }
                    dataBuffer.release();
                }
            }catch (Exception e){}finally {
                v=null;
            }
        });
    }

AdaptCachedBodyGlobalFilter

// PooledDataBuffer = exchange.getAttributeOrDefault(CACHED_REQUEST_BODY_ATTR, null);
  Object body = exchange.getAttributeOrDefault(CACHED_REQUEST_BODY_ATTR, null);
        Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
        if (body != null || !this.routesToCache.containsKey(route.getId())) {
            return chain.filter(exchange);
        }