Like autwired RedisTemplate <String, Long>
I want to use RedisTemplate when loading spring. I can use StringRedeisTemplate successfully, but when I cannot use RedisTemplate. here is the code.
@Service public class MyService { @Autowired private RedisTemplate<String, Long> template; public void execute() { template.opsForValue().set("hoge", 1l); } }
But when you start the application, you get errors.
> 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
The stacktrace package assumes that you have not defined the Bean that you want to use for input in RedisTemplate
. You can enable it by creating a configuration file, for example.
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; } }
After you have a configuration file, you need to transfer it to SpringApplication.run
for example.
Object[] sources = {AppConfig.class}; ApplicationContext ctx = SpringApplication.run(sources, args);
If you use Spring boot, add a dependency on spring-boot-starter-redis, which will result in a redisTemplate bean. However, the bean is of type RedisTemplate<Object, Object>
,
So, create another bean for the necessary operations, as shown here enter the link here
You can do as sol4me
at the top, but you can handle this in a simple way:
1, automatic wire RedisTemplate
@Autowired private RedisTemplate redisTemplate;
2, set the value as follows:
redisTemplate.opsForValue().set("yourkey", 12434L);
3, get a value similar to this:
(Long) redisTemplate.opsForValue().get("yourkey");
There is no need to create a bean like RedisTemplate< String, Long >
, if you do so, you can create many beans on your system. So just use the easy way.