我想在春季启动时使用RedisTemplate。 我可以成功使用StringRedeisTemplate,但是当我无法使用RedisTemplate时。 这是代码。
@Service
public class MyService {
@Autowired
private RedisTemplate<String, Long> 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
答案 0 :(得分:8)
堆栈跟踪表明您尚未定义要用于RedisTemplate
注入的Bean。您可以解析它创建配置文件,例如
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);
答案 1 :(得分:2)
如果使用Spring启动,请在spring-boot-starter-redis中添加一个依赖项,它将引入redisTemplate bean。但是,该bean的类型为RedisTemplate<Object, Object>
,
因此,为您需要的操作创建另一个bean,如enter link description here
所示答案 2 :(得分:0)
你可以按照pd.melt
在顶部说,但你可以轻松地处理这个问题:
1,自动连线sol4me
RedisTemplate
2,设置如下值:
@Autowired
private RedisTemplate redisTemplate;
3,得到这样的价值:
redisTemplate.opsForValue().set("yourkey", 12434L);
不需要创建像(Long) redisTemplate.opsForValue().get("yourkey");
这样的bean,如果你这样做,你可以在你的系统中创建很多bean。所以只需使用简单的方法。
答案 3 :(得分:0)
给出不同的东西,就像现在是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来检查依赖项是否是最新的。
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
Redis config
@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<Long,User>
*/
@Bean
@Qualifier("redisUserTemplate")
public RedisTemplate<Long, User> redisUserTemplate() {
RedisTemplate<Long, User> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(new LettuceConnectionFactory());
return redisTemplate;
}
使用RedisTemplate
private RedisTemplate redisTemplate
//@Qualifier to choose the bean you actually want.
@Autowired
public constructor(@Qualifier("xxxRedisTemplate")RedisTemplate redisTemplate){
this.redisTemplate=redisTemplate;
}
使用redisTemplate
private HashOperations<Long, byte[], byte[]> hashOperations = redisUserTemplate.opsForHash();
private HashMapper<Object, byte[], byte[]> hashMapper = new ObjectHashMapper();
@Nullable
public void saveObject(Long key, User user) {
Map<byte[], byte[]> mappedHash = hashMapper.toHash(user);
hashOperations.putAll(key, mappedHash);
}
public Object loadObject(Long key) {
Map<byte[], byte[]> loadedHash = hashOperations.entries(key);
return hashMapper.fromHash(loadedHash);
}
如果您遇到圆形弹簧注入错误,请考虑setter injection,@ Lazy,@ PostConstructor或实现ApplicationContextAware,InitalizingBean,有关更多信息,请浏览此链接how to fix this