Я использую данные весны 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;
}
}
Хм, я пробовал код (с некоторыми изменениями в sentinel-config), и я получил его работу. Существуют ли какие-либо другие конфигурации, которые вы добавили (например, некоторые redis-xml-stuff)? – wassgren
Я не использую другую конфигурацию. Работает ли 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
Я сделал это, выполнив 2 изменения. Один из них, заставляя использовать CGLIB с этим , 2-е изменение пакета класса журнала AOP, чтобы указать мой пакет приложений только с @Around ("исполнение (* com .myapplication.code .. *. * (..)) "). При этом он прекратил регистрацию АОП для классов весеннего каркаса –
Nandeesh