几天前项目基本完工,此时突然来了需求。需要做一个系统消息机制。就是关于用户的一些通知类型的消息。类似知乎、csdn网页端登录后会有消息提示
此时并不需要修改每个需要添加的系统消息的地方。
而是将这需要发送系统消息的地方归为一类,分不同的标识即可。
1 import java.lang.annotation.ElementType; 2 import java.lang.annotation.Retention; 3 import java.lang.annotation.RetentionPolicy; 4 import java.lang.annotation.Target; 5 /*** 6 * flag 1-认证 2-邀请 3-活动 4-礼品 5-个人中心 7 * @author 8 */ 9 @Target({ElementType.METHOD, ElementType.TYPE}) 10 @Retention(RetentionPolicy.RUNTIME) 11 public @interface SysMessage { 12 String flag() default ""; 13 }
1.这里自定义一个接口,用来接收不同种类的消息。↑
1 @Around("@annotation(sysMessage)") 2 public synchronized Object arround(ProceedingJoinPoint pjp,SysMessage sysMessage) { 3 try { 4 Object o = pjp.proceed(); //o 返回值 ResponseObj 5 Sysmsg sysmsg = new Sysmsg(); 6 if(Integer.parseInt(sysMessage.flag()) == 1){ 7 if(((ResponseObj) o).getErrcode() == 0 ){ 8 sysmsg.setUserId((Integer)pjp.getArgs()[0]); 9 sysmsg.setContent("平台认证未通过,请前往<a href='https://cnblogs.com/atimo'>个人中心</a>重新认证"); 10 sysmsg.setMsgType(Integer.parseInt(sysMessage.flag())); 11 sysmsg.setIsRead(false); 12 sysmsg.setSendTime(new Date()); 13 sysmsg.setDeleteFlag(false); 14 msgService.addSysmsg(sysmsg); 15 } 16 } 17 }
2.这里我使用的是环切,这里要加注解.↑
@Around("@annotation(sysMessage)")
其中sysMessage自定义接口名称,首字母小写,即可。
这里是接收消息端,通过 ProceedingJoinPoint 类可获取到controller控制层调用时返回的信息。
controller无论成功与否,根据返回的消息判断是否需要添加消息。
3.下面是调用时只需注明是什么类型的消息请求即可
1 @ResponseBody 2 @RequestMapping(value="/checkid") 3 @SysMessage(flag = "1") 4 public Object checkid(Integer userId,String idname,Integer status){ 5 try{ 6 if(this.carownerService.checkid(userId,idname,status) > 0){ 7 return getResponse(0, "ID审核成功!"); 8 }else{ 9 return getResponse(1, "ID审核失败!"); 10 } 11 }catch (Exception e) { 12 e.printStackTrace(); 13 logger.error("审核ID时:" + e.toString()); 14 return getResponse(-1); 15 } 16 }
这里加上 @SysMessage(flag = "1")
注解为自定义的接口名,flag值即为传输过去的类型值,后台处理消息根据传入的flag值代表不同类型的消息。