当前位置: 首页 > 知识库问答 >
问题:

Spring数据Redis

百里星纬
2023-03-14

我正在使用Spring data 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

下面是使用spring data redis的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;
    }
}

下面是用于日志记录的Aspectj配置。如果我对@Component进行注释,除了记录之外,一切都很好,但是如果@Component存在,同样的事情就不起作用了。AspectJ似乎与spring数据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;
    }
}

共有1个答案

邢小云
2023-03-14

请确保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兼容。你应该把你的绝地武士(2.6.1)版本降到2.5.2。

 类似资料:
  • 我试图用jqGrid解决Spring Data Rest的问题,所有的事情都很好,除了我想要将对象全部作为序列化返回,所以在ManyToOne关系中,我现在只得到该对象的链接,而我想要将它序列化。 如您所见,中的accountManager类返回为link,但我希望它也被序列化,以便在JQGrid中显示Name属性。 向Shahbour问好

  • 我有一个简单的JpaRepository和一个finder,它返回按名为“number”的属性降序排列的记录。“number”属性也是我的实体的@Id。这很好,但是有数千条记录,所以我想返回一个页面而不是列表。 如果我将查找器更改为以下内容,则排序不再起作用。我尝试过使用可分页参数的排序功能,但不起作用。还删除了OrderByNumberDesc,但结果相同。 EDIT-添加控制器方法 以下是我的

  • 我正在使用spring数据jpa为我的服务实现多事务(数据库),带有两个持久的单元名。并在Jboss 6.4 EAP中部署 以下是我的服务详情 在Jboss中,我无法部署它,我遇到以下异常: 原因:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有com.test.demo.domain.repository.Tb

  • 问题是,Spring HATEOAS和Spring Data Rest之间有什么区别? 我觉得两者都可以做同样的事情,Spring数据Rest(作为Spring数据的一部分)似乎更有活力。 https://github.com/spring-projects/spring-hateoas https://github.com/spring-projects/spring-data-rest 你什么

  • 问题内容: 以下是我的申请流程 控制器-服务-存储库 在服务层,我们具有注释。我们还具有配置,在其中指定实体管理器和txn管理器。 我的怀疑是我认为考虑了在其中指定的txn管理器,并且在服务层进行指定没有影响。例如:服务层可以映射到自定义的txn管理器,其中服务调用的存储库可能具有不同的txn管理器。在那种情况下会不会造成问题? 有人可以澄清一下,在使用jpa存储库时是否需要将其放置在服务层上?

  • 我刚开始使用和*对象,我一直在做一个简单的左连接,并将一个值与一个连接的实体属性进行比较。由于我要构建的这个查找/选择函数迟早会非常动态,我决定使用Criteria对象,而不是使用不同的参数构建不同的函数。我的真实实体有更多的属性,但我在这里分解它来简化它。 之前,我试图做我的第一步我有一个仓库函数,这是注释与和工作正常: 后来,我试图建立一个忽略小写和名称的规范,但我仍然无法正确地将name参数