Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring数据Redis_Spring_Redis_Spring Data Redis - Fatal编程技术网

Spring数据Redis

Spring数据Redis,spring,redis,spring-data-redis,Spring,Redis,Spring Data Redis,我正在使用spring数据redis和jedis与aspectJ进行日志记录。 但是得到下面的错误。请帮助解决此错误。我花了很多时间在这个问题上,但无法解决它 我使用的是spring数据redis 1.4.1,jedis-2.6.1和redis-2.8 错误详细信息:- Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Illegal arguments to factory method [pu

我正在使用spring数据redis和jedis与aspectJ进行日志记录。 但是得到下面的错误。请帮助解决此错误。我花了很多时间在这个问题上,但无法解决它

我使用的是spring数据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
下面是使用SpringDataRedis的redis Sentinel配置的Java配置文件

@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;
    }
}
@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;
    }
}
@配置
公共类RedSentineLapplicationConfig{
私有静态最终记录器Logger=LoggerFactory.getLogger(RedisSentinelApplicationConfig.class);
@自动连线
私人环境署;
@值(${redis.master}”)
私有字符串REDIS_MASTER;
公共重新发送配置重新发送配置(){
if(null!=env){
debug(“env-->”+env.getProperty(“redis.master”);
}否则{
debug(“ENV对象为null”);
}
debug(“REDIS\u MASTER-->”+REDIS\u MASTER);
最终RedisSentinelConfiguration SENTINEL_CONFIG=新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”);
返回SENTINEL_配置;
}
@豆子
公共重新连接工厂jedisConnectionFactory(){
返回新的JedisConnectionFactory(sentinelConfig());
}
@豆子
公共重新发送配置发送配置(){
返回重新发送配置();
}
@豆子
公共RedisTemplate RedisTemplate(){
RedisTemplate=新RedisTemplate();
setConnectionFactory(jedisConnectionFactory());
setValueSerializer(jackson2JsonRedisSerializer());
setHashValueSerializer(jackson2JsonRedisSerializer());
返回模板;
}
@抑制警告(“原始类型”)
@Bean(name=“cacheService”)
公共缓存服务缓存服务(){
返回新的CacheServiceImpl();
}
@豆子
公共Jackson2JsonRedisSerializer Jackson2JsonRedisSerializer(){
Jackson2JsonRedisSerializer Jackson2JsonRedisSerializer=新Jackson2JsonRedisSerializer(
对象(类);
setObjectMapper(objectMapper());
返回jackson2json重新序列化器;
}
@豆子
公共对象映射器对象映射器(){
ObjectMapper ObjectMapper=新的ObjectMapper();
setVisibility(PropertyAccessor.ALL、JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(objectMapper.DefaultTyping.NON_FINAL);
返回对象映射器;
}
}
下面是用于日志记录的Aspectj配置。如果我对@Component进行注释,除了记录之外,一切都很好 但如果@Component存在,同样的方法就不起作用了。AspectJ似乎与spring数据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;
    }
}
@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;
    }
}
@组件
@面貌
公共类性能应用程序记录器{
私有静态最终记录器日志=LoggerFactory.getLogger(PerfApplicationLogger.class);
@围绕(“执行(**(…)”)
公共对象logTimeMethod(ProceedingJoinPoint joinPoint)抛出可丢弃的{
秒表秒表=新秒表();
秒表。开始();
Object retVal=joinPoint.procedure();
秒表;
StringBuilder logMessage=新建StringBuilder();
append(joinPoint.getTarget().getClass().getName());
logMessage.append(“.”);
logMessage.append(joinPoint.getSignature().getName());
logMessage.append(“”);
//附加参数
对象[]args=joinPoint.getArgs();
对于(int i=0;i0){
logMessage.deleteCharAt(logMessage.length()-1);
}
logMessage.append(“)”;
追加(“执行时间:”);
append(stopWatch.getTotalItemillis());
logMessage.append(“ms”);
log.debug(logMessage.toString());
返回返回;
}
}

请确保spring data redis版本与绝地版本兼容


参考链接(),spring data redis与绝地2.5.2兼容。你应该把你的绝地武士(2.6.1)版本降到2.5.2

嗯,我已经试过了代码(对sentinel配置做了一些修改),我让它工作了。您是否添加了任何其他配置(例如一些redis xml内容)?我不使用任何其他配置。AOP日志对您来说工作正常吗?我尝试过调试,发现的根本原因如下:java.lang.IllegalStateException:无法将[com.sun.proxy.$Proxy16 implementing org.springframework.data.redis.connection.NamedNode、org.springframework.aop.SpringProxy、org.springframework.aop.framework.Advised]类型的值转换为所需类型[org.springframework.data.redis.connection.RedisNode]用于属性“sentinels[0]”:未找到匹配的编辑器或转换策略我已通过执行2次更改使其正常工作。一次更改是强制使用CGLIB,第二次更改AOP日志记录类的包,使其仅使用@Around(“执行”)指向我的应用程序包(*com.myapplication.code.**(..)”),它停止了对spring框架类进行AOP日志记录