如何自动连接RedisTemplate

我想在春季启动时使用RedisTemplate。 我可以成功使用StringRedeisTemplate,但是当我无法使用RedisTemplate时。 这是代码。

@Service public class MyService { @Autowired private RedisTemplate template; public void execute() { template.opsForValue().set("hoge", 1l); } } 

但是,当启动应用程序时,会出错。

 > Exception in thread "main" > org.springframework.beans.factory.BeanCreationException: Error > creating bean with name 'MyService': Injection of autowired > dependencies failed; nested exception is > org.springframework.beans.factory.BeanCreationException: Could not > autowire field: private > org.springframework.data.redis.core.RedisTemplate > org.hoge.service.MyService.template; nested exception is > org.springframework.beans.factory.NoSuchBeanDefinitionException: No > qualifying bean of type > [org.springframework.data.redis.core.RedisTemplate] found for > dependency: expected at least 1 bean which qualifies as autowire > candidate for this dependency. Dependency annotations: > {@org.springframework.beans.factory.annotation.Autowired(required=true)} > at > org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) > at > org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) > at > org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) > at > org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) > at > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762) > at > org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) > at > org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) > at > org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109) > at > org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) > at > org.springframework.boot.SpringApplication.run(SpringApplication.java:321) > at > org.springframework.boot.SpringApplication.run(SpringApplication.java:961) > at > org.springframework.boot.SpringApplication.run(SpringApplication.java:950) > at > jp.bizreach.davide.recommend.application.DavimendApplication.main(DavimendApplication.java:11) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:483) at > com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) > Caused by: org.springframework.beans.factory.BeanCreationException: > Could not autowire field: private > org.springframework.data.redis.core.RedisTemplate > org.hoge.service.MyService.template; nested exception is > org.springframework.beans.factory.NoSuchBeanDefinitionException: No > qualifying bean of type > [org.springframework.data.redis.core.RedisTemplate] found for > dependency: expected at least 1 bean which qualifies as autowire > candidate for this dependency. Dependency annotations: > {@org.springframework.beans.factory.annotation.Autowired(required=true)} > at > org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:558) > at > org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) > at > org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) > ... 21 more Caused by: > org.springframework.beans.factory.NoSuchBeanDefinitionException: No > qualifying bean of type > [org.springframework.data.redis.core.RedisTemplate] found for > dependency: expected at least 1 bean which qualifies as autowire > candidate for this dependency. Dependency annotations: > {@org.springframework.beans.factory.annotation.Autowired(required=true)} > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1308) > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054) > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949) > at > org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:530) > ... 23 more 

RedisTemplate表明您尚未定义要用于在RedisTemplate进行注入的RedisTemplate 。您可以解析它创建配置文件,例如

 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericToStringSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class AppConfig { @Bean JedisConnectionFactory jedisConnectionFactory() { return new JedisConnectionFactory(); } @Bean RedisTemplate< String, Long > redisTemplate() { final RedisTemplate< String, Long > template = new RedisTemplate< String, Long >(); template.setConnectionFactory( jedisConnectionFactory() ); template.setKeySerializer( new StringRedisSerializer() ); template.setHashValueSerializer( new GenericToStringSerializer< Long >( Long.class ) ); template.setValueSerializer( new GenericToStringSerializer< Long >( Long.class ) ); return template; } } 

获得配置文件后,需要将其传递给SpringApplication.run例如

 Object[] sources = {AppConfig.class}; ApplicationContext ctx = SpringApplication.run(sources, args); 

如果使用Spring引导,请向spring-boot-starter-redis添加依赖项,这将引入redisTemplate bean。 但是,该bean的类型为RedisTemplate

因此,为您需要的操作创建另一个bean,如此处所示,在此处输入链接描述

你可以像sol4me在顶部说,但你可以轻松地处理这个问题:

1,自动连线RedisTemplate

 @Autowired private RedisTemplate redisTemplate; 

2,设置如下值:

 redisTemplate.opsForValue().set("yourkey", 12434L); 

3,得到这样的价值:

 (Long) redisTemplate.opsForValue().get("yourkey"); 

无需像RedisTemplate< String, Long >那样创建一个bean,如果你这样做,你可以在你的系统中创建很多bean。 所以只需使用简单的方法。

给出一些与众不同的东西,就像现在的2018年一样(有很多变化阻碍了我很长时间)

  • 第一Dependency (Gradle)

     compile('org.springframework.boot:spring-boot-starter-data-redis') compile('org.springframework.boot:spring-boot-starter-data-redis-reactive') 

记得使用最新版本,你可以使用gradle-use-latest-versions-plugin来检查依赖是否是最新的。

  1. RedisServer

     [Linux] redis-server [spring.properties] spring.redis.host=localhost spring.redis.port=6379 spring.cache.cache-names=orderIdPool,users spring.cache.redis.cache-null-values=true spring.cache.redis.time-to-live=600000ms 
  2. Redis配置

     @Configuration public class RedisConfig { /** * create a lettuceConnectionFactory for redisTemplate {@link #redisUserTemplate()} * @return LettuceConnectionFactory, the old version use Jedis */ @Bean public LettuceConnectionFactory lettuceConnectionFactory() { return new LettuceConnectionFactory(); } /** * Description: aiming to create a template for Long and user(To be a user cache) * @return redisTemplate */ @Bean @Qualifier("redisUserTemplate") public RedisTemplate redisUserTemplate() { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(new LettuceConnectionFactory()); return redisTemplate; } 
  3. 使用RedisTemplate

     private RedisTemplate redisTemplate //@Qualifier to choose the bean you actually want. @Autowired public constructor(@Qualifier("xxxRedisTemplate")RedisTemplate redisTemplate){ this.redisTemplate=redisTemplate; } 
  4. 使用redisTemplate

     private HashOperations hashOperations = redisUserTemplate.opsForHash(); private HashMapper hashMapper = new ObjectHashMapper(); @Nullable public void saveObject(Long key, User user) { Map mappedHash = hashMapper.toHash(user); hashOperations.putAll(key, mappedHash); } public Object loadObject(Long key) { Map loadedHash = hashOperations.entries(key); return hashMapper.fromHash(loadedHash); } 
  5. 如果您遇到圆形弹簧注入错误,请考虑setter注入,@ Lagzy,@ PostConstructor或实现ApplicationContextAware,InitalizingBean,有关更多信息,请浏览此链接如何解决此问题