2014-12-29 64 views
1

我使用彈簧數據redis和jedis與aspectJ進行日誌記錄。 但得到以下錯誤。請幫助解決這個錯誤。我花了很多時間在這個上,但無法解決它。Spring Data Redis

我使用的是彈簧數據redis的1.4.1,jedis-2.6.1用Redis的-2.8

錯誤詳細信息: -

Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Illegal arguments to factory method [public org.springframework.data.redis.core.RedisTemplate com.test.RedisSentinelApplicationConfig.redisTemplate()]; args: 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:172) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:586) 
    ... 38 more 

下面是Redis的哨兵配置Java配置文件使用彈簧數據redis

@Configuration 
public class RedisSentinelApplicationConfig { 
    private static final Logger logger = LoggerFactory.getLogger(RedisSentinelApplicationConfig.class); 

    @Autowired 
    private Environment env; 

    @Value("${redis.master}") 
    private String REDIS_MASTER; 

    public RedisSentinelConfiguration redisSentinelConfiguration() { 
     if(null != env){ 
      logger.debug("env-->" + env.getProperty("redis.master")); 
     }else{ 
      logger.debug("ENV object is null"); 
     } 

     logger.debug("REDIS_MASTER-->" + REDIS_MASTER); 

     final RedisSentinelConfiguration SENTINEL_CONFIG = new RedisSentinelConfiguration() 
     .master(env.getProperty("redis.master")) 
     .sentinel(env.getProperty("redis.sentinel1.host"), Integer.valueOf(env.getProperty("redis.sentinel1.port"))) 
     .sentinel(env.getProperty("redis.sentinel2.host"), Integer.valueOf(env.getProperty("redis.sentinel2.port"))) 
     .sentinel(env.getProperty("redis.sentinel3.host"), Integer.valueOf(env.getProperty("redis.sentinel3.port"))); 

     return SENTINEL_CONFIG; 
    } 

    @Bean 
    public RedisConnectionFactory jedisConnectionFactory() { 
     return new JedisConnectionFactory(sentinelConfig()); 
    } 

    @Bean 
    public RedisSentinelConfiguration sentinelConfig() { 
     return redisSentinelConfiguration(); 
    } 

    @Bean 
    public RedisTemplate<String, ?> redisTemplate() { 
     RedisTemplate<String, ?> template = new RedisTemplate(); 
     template.setConnectionFactory(jedisConnectionFactory()); 
     template.setValueSerializer(jackson2JsonRedisSerializer());  
     template.setHashValueSerializer(jackson2JsonRedisSerializer()); 
     return template; 
    } 

    @SuppressWarnings("rawtypes") 
    @Bean(name="cacheService") 
    public CacheService CacheService() { 
     return new CacheServiceImpl(); 
    } 

    @Bean 
    public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() { 
     Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(
       Object.class); 
     jackson2JsonRedisSerializer.setObjectMapper(objectMapper()); 
     return jackson2JsonRedisSerializer; 
    } 

    @Bean 
    public ObjectMapper objectMapper() { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); 
     objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 
     return objectMapper; 
    } 
} 

以下是用於日誌記錄的Aspectj配置。如果我對@Component發表評論,除了記錄所有工作完美無缺外 ,但如果存在@Component,則同樣不起作用。它看起來像AspectJ與彈簧數據redis衝突

@Component 
@Aspect 
public class PerfApplicationLogger { 
    private static final Logger log = LoggerFactory.getLogger(PerfApplicationLogger.class); 

    @Around("execution(* *(..))") 
    public Object logTimeMethod(ProceedingJoinPoint joinPoint) throws Throwable { 

      StopWatch stopWatch = new StopWatch(); 
      stopWatch.start(); 

      Object retVal = joinPoint.proceed(); 

      stopWatch.stop(); 

      StringBuilder logMessage = new StringBuilder(); 
      logMessage.append(joinPoint.getTarget().getClass().getName()); 
      logMessage.append("."); 
      logMessage.append(joinPoint.getSignature().getName()); 
      logMessage.append("("); 
      // append args 
      Object[] args = joinPoint.getArgs(); 
      for (int i = 0; i < args.length; i++) { 
       logMessage.append(args[i]).append(","); 
      } 
      if (args.length > 0) { 
       logMessage.deleteCharAt(logMessage.length() - 1); 
      } 

      logMessage.append(")"); 
      logMessage.append(" execution time: "); 
      logMessage.append(stopWatch.getTotalTimeMillis()); 
      logMessage.append(" ms"); 
      log.debug(logMessage.toString()); 
      return retVal; 
    } 
} 
+0

嗯,我已經嘗試過代碼(對sentinel-config進行了一些修改),然後我開始工作。是否還有其他配置(例如某些redis-xml-stuff)? – wassgren

+0

我沒有使用任何其他配置。 AOP日誌記錄工作正常嗎?我試着調試和我發現根本原因是由如下引起:java.lang.IllegalStateException:無法將類型的值com.sun.proxy $ Proxy16實施org.springframework.data.redis.connection.NamedNode, org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised]至所需的類型[org.springframework.data.redis.connection.RedisNode用於屬性「哨兵[0]」:沒有匹配的編輯器或轉換策略發現 – Nandeesh

+0

我已做2個變化工作。一個通過強制使用CGLIB與此,第二改變AOP日誌類的包僅與@Around(「執行(指向我的應用程序包* COM .myapplication.code。*。*(..))「)。因此,它停止爲Spring框架類執行AOP日誌記錄 – Nandeesh

回答

相關問題