2014-12-29 3 views
1

Я использую данные весны redis и jedis с aspectJ для регистрации. Но получив следующую ошибку. Помогите устранить эту ошибку. Я потратил много времени на это, но не смог его решить.Весна Данные 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 

Ниже приведен файл конфигурации Java для Redis конфигурации Сентинел с использованием данных пружины 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 с этим , 2-е изменение пакета класса журнала AOP, чтобы указать мой пакет приложений только с @Around ("исполнение (* com .myapplication.code .. *. * (..)) "). При этом он прекратил регистрацию АОП для классов весеннего каркаса – Nandeesh

ответ

Смежные вопросы