幾天前項目基本完工,此時突然來了需求。需要做一個系統消息機制。就是關於用戶的一些通知類型的消息。類似知乎、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值代表不同類型的消息。