项目场景:
项目中有对朋友圈和评论进行审核的功能,为了在不修改原有代码,想通过spring aop来完成对朋友圈和评论的审核工作。
问题描述:
在spring aop中使用@AspectJ注解来实现,代码如下:
@Aspect
@Component
public class CheckShareCircleSensitiveWordsAspect {
private final static Logger logger = LoggerFactory.getLogger(CheckShareCircleSensitiveWordsAspect.class);
/**
* 处理朋友圈内容
* @Description TODO
* @Date 2020/10/22 下午2:42
* @param joinPoint
* @return java.lang.Object
**/
@Around("execution(* com.vv.obj.sharecircle.app.controller.api.AppShareCircleController.publish(..))")
public Object checkShareCircles(ProceedingJoinPoint joinPoint) {
//前置处理
Object[] args = joinPoint.getArgs();
int length = args == null ? 0 : args.length;
for (int i = 0; i < length; i++) {
Object arg = args[i];
if (!(arg instanceof AppPublishEnterpriseUserShareRequest)) {
continue;
}
//强制转换
AppPublishEnterpriseUserShareRequest request = (AppPublishEnterpriseUserShareRequest)arg;
//检查敏感词并返回处理后的内容
String content = this.detailSensitiveWords(request.getContent());
//重新放回到request中
request.setContent(content);
//将request重新放回args中
args[i] = request;
}
Object proceed = null;
//将参数正式交给controller处理
try {
proceed = joinPoint.proceed(args);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
logger.info("joinPoint.proceed 返回类型是否为 JsonResult :" + (proceed instanceof JsonResult));
return proceed;
}
/**
* 处理敏感词,并返回
* @Description TODO
* @Date 2020/10/22 下午2:51
* @param content
* @return java.lang.String
**/
private String detailSensitiveWords(String content) {
//取出content检查是否存在敏感字词
logger.info("新发表的朋友圈内容为:" + content);
return content;
}
/**
* 处理朋友圈内容
* @Description TODO
* @Date 2020/10/22 下午2:42
* @param joinPoint
* @return java.lang.Object
**/
@Around("execution(* com.vv.obj.sharecircle.app.controller.api.AppShareCircleController.publishShareComment(..))")
public Object checkShareCircleComments(ProceedingJoinPoint joinPoint) {
//前置处理
Object[] args = joinPoint.getArgs();
if (args != null) {
}
Object proceed = null;
//将参数正式交给controller处理
try {
proceed = joinPoint.proceed(args);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return proceed;
}
}
原因分析:
网上搜索各种,原因大多千篇一律:要么就是POM文件中缺少jar包依赖,如下:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.4</version>
</dependency>
要么就是启动类中没有添加注解@EnableAspectJAutoProxy
实际验证发现,项目中既导入了对应的jar包,也添加了@EnableAspectJAutoProxy,还是不起作用。
解决方案:
非常感谢博主【panchanggui】博客地址: https://www.cnblogs.com/panchanggui/p/10761305.html
主要还是在刚开始创建Java类时,使用idea工具创建的是Aspect文件,然后后来从代码里面改成class文件的,根据上面博主的方式,重新创建一个Java类,代码考过去,编译重启,成功了。