2
回答
SpringAop中将数据序列化后,反反序列化取数据,数据类型不一致
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

使用切面进行缓存处理时,不影响现有系统的稳定性,所以将值进行Json序列化后存入缓存,一般对象可以实现解析,但是碰到复杂对象时,就难办了,比如List<Person>,这种格式的反序列化后 Person就编程了JsonObject了.

大牛有好的办法解决这个问题不,代码如下


@Pointcut("execution(* com.haoyi.business.registered.service.DoctorInfoService.selectDoctorInfo*(..))")
  public void registerDataPoint() {}

  @SuppressWarnings("unchecked")
  @Around("registerDataPoint()")
  public Object aroundPoint(ProceedingJoinPoint thisJoinPoint) {
    logger.debug("进入aroundPoint切面方法.....");
    try {
      MemcachedHelper memcachedHelper = MemcachedHelper.getInstance();
      String  enCacheName =getUniqueSid(thisJoinPoint);
      if (memcachedHelper.keyExists(enCacheName)) {
        logger.debug(enCacheName+",直接取出缓存数据....");
        return JSONObject.parseObject((String)memcachedHelper.get(enCacheName),((MethodSignature) thisJoinPoint.getSignature()).getReturnType());
      }
      Object obj = (Object) thisJoinPoint.proceed();
      logger.debug("记录缓存,Name:"+enCacheName);
      memcachedHelper.set(enCacheName, JSONObject.toJSONString(obj), new Date( 5 * 60 * 1000));
      return obj;
    } catch (Throwable e) {
      logger.error("进入切面抛出异常....");
      e.printStackTrace();
    }
    return null;
  }
 
  /**
   * 计算缓存唯一名称
   * @param thisJoinPoint
   * @return
   */
  private String getUniqueSid(ProceedingJoinPoint thisJoinPoint){
    String enCacheName = FcConstant.HY_SERVICE_MARK;
    String cacheName = thisJoinPoint.getSignature().toShortString();
    if (null != thisJoinPoint.getArgs()) {
      for (int i = 0; i < thisJoinPoint.getArgs().length; i++) {
        cacheName += "|" + JSONObject.toJSONString(thisJoinPoint.getArgs()[i]);
      }
    }
    enCacheName+= GoodDocMd5Util.getMd5Format32(cacheName);
    return enCacheName;
  }
当碰到List这种数据时,就出问题了
((MethodSignature) thisJoinPoint.getSignature()).getReturnType()

这个获取来的就是单纯的interface java.util.List,没反序列化成功,有完美的解决办法没



举报
顶部