spring-cloud-gateway
spring-cloud-gateway copied to clipboard
Why is it that when I use modifyresponsebodygatewayfilterfactory, it is always accidentally not implemented?
I record the requested input and output at the gateway,SCG version is:2.2.4.RELEASE
The filter that saves the request works normally, but the filter that records the response body does not record data occasionally, and the log info is not output。
save response body code is here:
public class ResponseUpdateGatewayFilterFactory extends ModifyResponseBodyGatewayFilterFactory {
@Autowired
private RequestLogServices requestLogServices;
@Autowired
private AmpGatewayProperties ampGatewayProperties;
@Override
public GatewayFilter apply(Config config) {
return new ModifyResponseGatewayFilter(this.getConfig());
}
private Config getConfig() {
Config cf = new Config();
cf.setInClass(String.class);
cf.setOutClass(String.class);
cf.setRewriteFunction(new ResponseUpdateRewriteFunction(requestLogServices,ampGatewayProperties));
return cf;
}
}
public class ResponseUpdateRewriteFunction implements RewriteFunction<String,String> {
private RequestLogServices requestLogServices;
private AmpGatewayProperties ampGatewayProperties;
public ResponseUpdateRewriteFunction(RequestLogServices requestLogServices, AmpGatewayProperties ampGatewayProperties){
this.requestLogServices = requestLogServices;
this.ampGatewayProperties = ampGatewayProperties;
}
@Override
public Publisher<String> apply(ServerWebExchange exchange, String body) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
String requestId = request.getHeaders().getFirst(Constans.REQUEST_ID);
log.info("requestId:{} request url:{} response body:{}",requestId,request.getPath().toString(),body);
if (StringUtils.isNotBlank(requestId)&&ServerWebExchangeUtils.isAlreadyRouted(exchange)){
Result result = null;
if(StringUtils.isNotBlank(body)){
result = JSONObject.parseObject(body,Result.class);
}
updateResponse(requestId,response.getStatusCode().value(),result);
}
return Mono.just(body);
}
private void updateResponse(String requestId, int responseCode, Result result){
RequestLogEntity logEntity = new RequestLogEntity();
logEntity.setRequestId(requestId);
logEntity.setResponseCode(String.valueOf(responseCode));
if(result!=null){
logEntity.setResponseBody(result.toString());
logEntity.setBodyCode(result.getCode());
logEntity.setBodyMsg(result.getMessage());
}
requestLogServices.updateResponse(logEntity);
}
}
Has anyone encountered similar problems?