项目场景:
所有通过网关进入内管系统的交易,需进行公共检查,其中有一项是针对报文内容做防重检查,目的避免有人在短时间内在多个平台不断提交同一项业务,导致业务重复执行
问题描述:
当我通过注解进行AOP切面时,对传入的内容转换成JSON时报错
@Override
public void run(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
String body = "";
for(Object obj : args ) {
JOSNObject jsonObj = JSON.pareObject(JSON.toJSONString(obj));
if(jsonObj.containKey("body")){
JSONObject bodyJsonObj = jsonObj.getJSONObject("body");
body = JSON.toJSONString(bodyJsonObj);
break;
}
}
}
原因分析:
joinPoint.getArgs()返回的数组中携带有Request(HttpServletRequest)或者Response(HttpServletResponse)对象,导致序列化异常。
ServletRequest和ServletResponse是不能被序列化的
解决方案:
把args中的Request(HttpServletRequest)或者Response(HttpServletResponse)对象过滤即可
@Override
public void run(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
String body = "";
for(Object obj : args ) {
JOSNObject jsonObj = JSON.pareObject(JSON.toJSONString(obj));
if(!(obj instanceof HttpServletRequest) && !(obj instanceof HttpServletResponse)){
if(jsonObj.containKey("body")){
JSONObject bodyJsonObj = jsonObj.getJSONObject("body");
body = JSON.toJSONString(bodyJsonObj);
break;
}
}
}
}