@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" />