Весенние данные Redis

Я использую весенние данные Redis и Jedis с аспектом J для ведения журнала. Но получаю следующую ошибку. Пожалуйста, помогите в решении этой ошибки. Я потратил много времени на это, но не смог решить эту проблему.

Я использую весенние данные 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 Sentinel с использованием весенних данных 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 конфликтует с Spring Data 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;
    }
}

person Nandeesh    schedule 29.12.2014    source источник
comment
Хм, я попробовал код (с некоторыми изменениями в sentinel-config), и он у меня заработал. Есть ли какие-либо другие конфигурации, которые вы добавили (например, некоторые файлы redis-xml)?   -  person wassgren    schedule 30.12.2014
comment
Я не использую никакую другую конфигурацию. У вас нормально работает ведение журнала АОП? Я попытался выполнить отладку, и то, что я обнаружил, является основной причиной, как показано ниже. Вызвано: 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] для свойства «sentinels[0]»: не найдены подходящие редакторы или стратегия преобразования   -  person Nandeesh    schedule 30.12.2014
comment
Я заставил его работать, сделав 2 изменения. Во-первых, заставив использовать CGLIB с этим ‹aop:aspectj-autoproxy proxy-target-class=true/›, во-вторых, изменив пакет класса ведения журнала AOP, чтобы указать пакет моего приложения только с помощью @Around(execution(* com.myapplication. код..*.*(..))). При этом он перестал вести журнал AOP для классов Spring Framework.   -  person Nandeesh    schedule 30.12.2014


Ответы (1)


Убедитесь, что версия spring-data-redis совместима с версией Jedis.

По ссылке (http://mvnrepository.com/artifact/org.springframework.data/spring-data-redis/1.4.1.RELEASE), spring-data-redis совместим с Jedis 2.5.2. Вам следует понизить версию jedis (2.6.1) до 2.5.2.

person kwky    schedule 26.06.2015