2014-10-22 2 views
0

의 구조는이 같은, 빈 건축에서 "MongoTemplate"를 사용이 때 @Autowired가 제기 사용 방법 :

public class BasicRepository<T> implements DAO<T>{ 
... 
    @Autowired 
    private MongoTemplate mongoTemplate; 
    public BasicRepository(Class<?> typeParameterClass,DBConvertor<T> convertor){ 
     getLogger().info("create a Object of BasicRepository,type of "+typeParameterClass); 
     this.typeParameterClass = typeParameterClass; 
     mongoTemplate.getCollectionName(typeParameterClass); 
     this.convertor = convertor; 
    } 
... 
    } 

구성 :

public class BeansConfiguration { 
    @Bean 
    DBConvertor<Topic> topicConvertor(){ 
     return new DBConvertor<>(Topic.class); 
    } 
    @Bean 
    BasicRepository<Topic> topicDao(){ 
     return new BasicRepository<Topic>(Topic.class,topicConvertor()); 

    } 
} 

보시다시피, 때 BasicRepository를 구성하면, 예외를 던질 것입니다. 왜냐하면 "mongoTemplate"이 시간을 만드는 동안 null이기 때문입니다. 어떻게해야합니까?

+3

'@ PostConstruct'를 확인하십시오. –

+0

템플릿을 필드 대신 생성자에 삽입하는 것이 좋습니다. – chrylis

+0

@SotiriosDelimanolis 감사합니다. 정말 도움이됩니다. – v11

답변

0

@Autowired는 생성자 순서를 보장 할 수 없습니다. 먼저 mongoTemplate을 초기화하려면 mongoTemplate을 BasicRepository의 생성자의 매개 변수로 사용할 수 있습니다. 그러면 Spring에서 종속 순서를 수행합니다.

+0

이 경우는 아닙니다. 그들은 명시 적으로 생성자를 호출합니다. 그들은 논쟁을 전파해야 할 것입니다. –

0

MongoTemplate의 구성이 누락되었습니다. 그리고이 저장소를 어디에서 호출했는지 확인해야합니다. 스프링 빈은 설정로드 후에 초기화된다. 스프링로드 전에 빈을 사용하면 null이된다.