自定义一个注解并实现注解返回后处理逻辑功能

自定义一个注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CommunityOperation {/*** 主键*/String id() default "id";/*** 类型*/ContentTypeEnum type();/*** 类型为空则使用typeName获取*/String typeName() default "type";
}

JDK的元注解主要有@Target,@Retention,@Document,@Inherited用来修饰注解
@Target:表示java可以应用的元素类型

ElementType.TYPE:应用于类、接口(包括注解类型)、枚举
ElementType.FIELD:应用于属性(包括枚举中的常量)
ElementType.METHOD:应用于方法
ElementType.PARAMETER:应用于方法的形参
ElementType.CONSTRUCTOR:应用于构造函数
ElementType.LOCAL_VARIABLE:应用于局部变量
ElementType.ANNOTATION_TYPE:应用于注解类型
ElementType.PACKAGE:应用于包
ElementType.TYPE_PARAMETER:1.8版本新增,应用于类型变量)
ElementType.TYPE_USE:1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型)

@Retention:表明该注解的生命周期

RetentionPolicy.SOURCE:编译时被丢弃,不包含在类文件中
RetentionPolicy.CLASS:JVM加载时被丢弃,包含在类文件中,默认值
RetentionPolicy.RUNTIME:JVM 加载,包含在类文件中,在运行时可以被获取到

@Document:表明该注解标记的元素可以被Javadoc 或类似的工具文档化
@Inherited:表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解

增加切面处理注解

@AfterReturning

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;@Aspect
@Scope
@Component
@Slf4j
public class CommunityOperationAspect {private ContentSendMsgFactory contentSendMsgFactory;@Pointcut(value = "@annotation(com.xxxx.xxx.xxxxxx.annoation.CommunityOperation)")public void activitySendMessage() {}@AfterReturning(value = "activitySendMessage()&&@annotation(communityOperation)",returning = "result")public Object beforeRequestIdVerify(JoinPoint joinPoint, Object result, CommunityOperation communityOperation) {try {JSONObject jsonObject=JSONObject.parseObject(JSONObject.toJSONString(result));if(jsonObject.getIntValue("code")!= DefaultHttpResultStatus.SUCCESS.getCode()){return result;}String id=StringUtils.EMPTY;Integer code=communityOperation.type().getCode();if(joinPoint.getArgs()[0] instanceof String){id=String.valueOf(joinPoint.getArgs()[0]);}else{JSONObject params=JSONObject.parseObject(JSONObject.toJSONString(joinPoint.getArgs()[0]));id=params.getString(communityOperation.id());if(communityOperation.type().getCode()==null){code=params.getInteger(communityOperation.typeName());}}if(StringUtils.isEmpty(id)){log.info("活动或评论发送消息到es未传ID");}contentSendMsgFactory.send(Long.valueOf(id),code);} catch (Throwable throwable) {log.error("统计社区用户失败{}",throwable);}return result;}@Autowiredpublic void setContentSendMsgFactory(ContentSendMsgFactory contentSendMsgFactory) {this.contentSendMsgFactory = contentSendMsgFactory;}
}

Around

    @Around("activitySendMessage()&&@annotation(communityOperation)")public Object beforeRequestIdVerify(ProceedingJoinPoint joinPoint, CommunityOperation communityOperation) {Object result = null;try {result = joinPoint.proceed();JSONObject jsonObject=JSONObject.parseObject(JSONObject.toJSONString(result));if(jsonObject.getIntValue("code")== DefaultHttpResultStatus.SUCCESS.getCode()){JSONObject params=JSONObject.parseObject(JSONObject.toJSONString(joinPoint.getArgs()[0]));Integer code=communityOperation.type().getCode();if(communityOperation.type().getCode()==null){code=params.getInteger(communityOperation.typeName());}if(StringUtils.isEmpty(params.getString(communityOperation.id()))){log.info("活动或评论发送消息到es未传ID");}contentSendMsgFactory.send(params.getLong(communityOperation.id()),code);}} catch (Throwable throwable) {log.error("统计社区用户失败{}",throwable);}return result;}

@Before

用于打印请求类名、方法名、请求参数

    @Before(value = "pointcutController()")public void before(JoinPoint joinPoint) {String className = joinPoint.getTarget().getClass().getName();String methodName = joinPoint.getSignature().getName();Object[] args = joinPoint.getArgs();List<Object> logArgs = streamOf(args).filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse))&& (arg instanceof MultipartHttpServletRequest)).collect(Collectors.toList());String argsJson = JSON.toJSONString(logArgs);String beforeLog = String.format("开始调用%s.%s,参数为:%s", className, methodName, argsJson);log.info(beforeLog);}

使用

    @CommunityOperation(id="id",type= ContentTypeEnum.ACTIVITY)@PostMapping("/v1/publish")public HttpResult<Boolean> publish(@NotNull @RequestBody final ActivityRequestBean activityRequestBean) {return DefaultHttpResultFactory.fail("发布/取消失败。", Boolean.FALSE);}

java 自定义AfterReturning切面注解相关推荐

  1. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  2. Java自定义数据脱敏注解

    应用场景 数据库中密文存储身份证.手机号等敏感信息时,Java需要将密文数据转换为明文并脱敏返回给前端. 脱敏方式枚举类 public enum DesensitizationTypeEnum {/* ...

  3. springboot项目中自定义注解的使用总结、java自定义注解实战(常用注解DEMO)

    初学spring的时候使用注解总觉得使用注解很神奇,加一个注解就能实现想要的功能,很好奇,也想自己根据需要写一些自己实现的自定义注解.问题来了,自定义注解到底是什么?肯定会有人和我一样有这个疑惑,我根 ...

  4. java 自定义注解_两步实现Java自定义注解

    什么是注解? 注解就是为容器提供元数据,例如@Controller 注解则是标记了该Bean需要交给Spring容器进行管理. 那么我们怎么去实现自个的注解,也就是自定义注解呢? 一.自定义一个注解( ...

  5. Java Springboot切面+注解实现数据脱敏

    Java Springboot切面+注解实现数据脱敏 1. 业务概述 2. 设计编码 2.1 脱敏类型枚举 2.2 脱敏注解 2.3 脱敏工具类 2.4 统一拦截器 2.5 统一结果集 2.6 用户实 ...

  6. java 自定义注解 解析_java自定义注解

    1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...

  7. Java自定义注解Annotation的实现原理

    文章目录 1.什么是注解? 2.注解的用处: 3.注解的原理: 4.元注解: 5.常见标准的Annotation: 6.自定义注解: 7.自定义注解实例: 1.什么是注解?   对于很多初次接触的开发 ...

  8. java自定义注解解析及自定义注解

    jdk1.5之后提供了注解(Annotation)这一种语法.其主要作用是编译检查(比如@override)和代码分析(通过代码中添加注解,利用注解解析器对添加了注解的代码进行分析,获取想要的结果,一 ...

  9. java自定义注解实现前后台参数校验

    其实是可以通过@Constraint来限定自定义注解的方法. @Constraint(validatedBy = xxxx.class) 下面是我做的 java自定义注解实现前后台参数校验 的代码示例 ...

最新文章

  1. 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第二章 深入理解Netd
  2. 使用describe命令进行Kubernetes pod错误排查
  3. 什么是Mockito Extra接口?
  4. java最接近对点及距离_最接近点对问题_分治法
  5. 关于网页js判断“客户端设备类型是移动端还是PC端“的解决方法?
  6. (17)FPGA速度和面积互换原则
  7. (转)RabbitMQ学习之消息可靠性及特性
  8. FreeRTOS学习笔记---任务控制块源码分析
  9. html5录音支持pc和Android、ios部分浏览器,微信也是支持的,JavaScript getUserMedia
  10. dBm 转 W 换算
  11. 计算某年某月某日到某年某月某日之间的天数
  12. 卡内基梅隆计算机专业,卡内基梅隆大学计算机专业介绍
  13. 请写出至少五个块级元素_以下属于行内块元素的是()
  14. python绘图小dome
  15. 互联网盈利模式研习笔记 1:流量变现
  16. 【LeetCode】1427、字符串的左右移
  17. HTB打靶日记:Bashed
  18. [渝粤教育] 西南科技大学 建筑工程定额与预算 在线考试复习资料2021版
  19. 【GIS开发】地理编码服务Geocoder(Python)
  20. 试卷自动生成系统(JSP+MySQL)

热门文章

  1. Drools 规则学习
  2. win10系统任务栏文件件右键快速访问历史打开文件夹设置
  3. RabbitMQ与CMQ的使用与实战
  4. 适用于 Linux 的最佳 Python IDE
  5. 如今,随着ai时代的变迁,我们应该何去何从?
  6. ArcGIS学习笔记-1.功能-1.5 栅格图基本
  7. “软硬兼施”:长沙软件业再出发
  8. java: 错误:无效的源发行版:14
  9. Android multiDex
  10. 欧几里德算法与皮克定理