2015-04-27 26 views
4

在我的SpringBoot项目中,当我使用以下注入RedisTemplate时,它是可以的。SpringBoot注入与自定义实体的RedisTemplate

@Repository 
public class CommonDBDaoImpl implements CommonDBDao { 
    @Autowired 
    RedisTemplate<String, Object> redisTemplate; 

    .... 
} 

但是,当我使用RedisTemplate定制Entity/DTO,注射失败..

@Repository 
public class CommonDBDaoImpl implements CommonDBDao { 
    @Autowired 
    RedisTemplate<String, PersonDTO> redisTemplate; 

    .... 
} 

public PersonDTO implements Serializable { 
    //field 
    //getter and setter 
} 

登录:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'commonDBDaoImpl': Injection of autowired dependenci 
es failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.data.red 
is.core.RedisTemplate com.java.my.dao.CommonDBDaoImpl.redisTemplate; nested exception is org.springframework.beans.factory.NoSuchBeanDe 
finitionException: 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.j 
ava:334) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210) 
    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:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
    at org.springframework.boot.test.SpringApplicationContextLoader.loadContext(SpringApplicationContextLoader.java:101) 
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:68) 
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:86) 
    ... 25 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.data.redis.core.RedisTemplat 
e com.java.my.dao.CommonDBDaoImpl.redisTemplate; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: N 
o qualifying bean of type [org.springframework.data.redis.core.RedisTemplate] found for dependency: expected at least 1 bean which qualifies as autowi 
re candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcesso 
r.java:561) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.j 
ava:331) 
    ... 40 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.data.redis.core.RedisTempl 
ate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springfra 
mework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcesso 
r.java:533) 
    ... 42 more 

我怎样才能在RedisTemplate定制Entity/DTO使用?

回答

3

RedisTemplate<String, PersonDTO> redisTemplateRedisTemplate<String, Object> redisTemplate是两个不同的签名,那么Spring无法找到第一个bean的bean,你必须手动定义一个新的bean。

你可以做到这一点是这样的:

@Bean 
    public RedisTemplate<String, PersonDTO> redisTemplatePersonDTO() { 
     return new RedisTemplate<String, PersonDTO>() { 
      /* the declaration of the object here */ 
     }; 
    } 

将您ApplicationConfig类中的代码,并确保与@EnableAutoConfiguration@Configuration

到annote它