对应版本: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);
}