Intercept the output of the @ResponseBody tag to print the log

 

@ResponseBody

@RequestMapping(value = "order/pickupinfo", method = RequestMethod.POST, produces = {

"application/json;charset=UTF-8" })

public ResReslt orderList(String req, HttpServletResponse response) {

 

   saveLog(...)//Save log method

return tt;

}

 

If you use the above aspects to write and write the output log, you need to write saveLog(...) in each method, which is more troublesome to maintain, and there may be missing places where there is no output log.

 

Below we implement import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

The way this interface outputs the log:

 

package com.cloud.tools.aop;

 

import org.slf4j.Logger;

import org.springframework.core.MethodParameter;

import org.springframework.http.MediaType;

import org.springframework.http.server.ServerHttpRequest;

import org.springframework.http.server.ServerHttpResponse;

import org.springframework.web.bind.annotation.ControllerAdvice;

import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

 

import com.cloud.api.pojo.ResPageReslt;

import com.cloud.api.pojo.ResReslt;

import com.cloud.api.util.ObjToJson;

import com.cloud.log.ReqAndResLog;

 

@ControllerAdvice 

public class ResponseBodyAdviceImp implements ResponseBodyAdvice{

 

Logger jsonLog = org.slf4j.LoggerFactory.getLogger(ResponseBodyAdviceImp.class);

 

@Override

public boolean supports(MethodParameter returnType, Class converterType) {

return true;

}

 

@Override

public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,

Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {

 

if(null !=body){

String flag = body.toString();

ReqAndResLog reqAndResLog = new ReqAndResLog();

ReqAndResLog temp = reqAndResLog.getInfo();

if(temp !=null){

//When the log object already exists, compare

if(flag.toString().equals(temp.getRes())){

// remove the log object

reqAndResLog.remove();

 

StringBuffer res = new StringBuffer(60);

res.append(returnType.getMethod().getName()).append(";");

if(body instanceof ResReslt){

res.append(ObjToJson.ResResltToStr((ResReslt)body));

}else if(body instanceof ResPageReslt){

res.append(ObjToJson.ResPageResltToStr((ResPageReslt)body));

}

 

jsonLog.debug(res.toString());

}

}else{

// There is no log object, join

reqAndResLog.setRes(flag);

reqAndResLog.setInfo (reqAndResLog);

}

}

 

return body;

}

 

 

}

 

 

package com.cloud.log;

 

public class ReqAndResLog {

 

public static final ThreadLocal<ReqAndResLog> REQ_AND_RES_LOG = new ThreadLocal<ReqAndResLog>();

// request parameters

private String req;

 

private String res;

 

public String getRes() {

return res;

}

 

public void setRes(String res) {

this.res = res;

}

 

public String getReq() {

return req;

}

 

public void setReq(String req) {

this.req = req;

}

 

public void setInfo(ReqAndResLog reqAndResLog){

REQ_AND_RES_LOG.set(reqAndResLog);

}

 

 

public ReqAndResLog getInfo(){

return REQ_AND_RES_LOG.get();

}

 

public void remove(){

REQ_AND_RES_LOG.remove();

}

 

 

}

 

ReqAndResLog: The function is to prevent the same log output on both sides;

 

 

2. Configuration file

 

<bean id="ResponseBodyAdviceImp" class="com.cloud.tools.aop.ResponseBodyAdviceImp" />

 

 

 

 

 

 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326618138&siteId=291194637