2016-11-30 81 views
2

我想改变我如何应用访问卡桑德拉分贝。我用的是弹簧数据卡桑德拉但由于它不支持UDT和其他的东西我已经决定使用与DAO模式datastax驱动程序。春天不进行初始化豆

但我有一些问题,psring未初始化豆datastax司机,我不知道哪里是错误的。

这是错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private ro.automotive.app.core.DAO.interfaces.BaseDAO ro.automotive.app.core.service.BaseServiceImpl.baseDAO; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usersDAOImpl' defined in file [E:\Proiecte Intellij\Stefan\automotive\target\ROOT\WEB-INF\classes\ro\automotive\app\core\DAO\UsersDAOImpl.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [ro.automotive.app.core.DAO.UsersDAOImpl]: Constructor threw exception; nested exception is java.lang.NullPointerException 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573) 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
... 72 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usersDAOImpl' defined in file [E:\Proiecte Intellij\Stefan\automotive\target\ROOT\WEB-INF\classes\ro\automotive\app\core\DAO\UsersDAOImpl.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [ro.automotive.app.core.DAO.UsersDAOImpl]: Constructor threw exception; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1105) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1050) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) 
    ... 74 more 
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [ro.automotive.app.core.DAO.UsersDAOImpl]: Constructor threw exception; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1098) 
    ... 85 more 
Caused by: java.lang.NullPointerException 
    at ro.automotive.app.core.DAO.BaseDAOImpl.<init>(BaseDAOImpl.java:29) 
    at ro.automotive.app.core.DAO.UsersDAOImpl.<init>(UsersDAOImpl.java:13) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) 
    ... 87 more 

这里是我的配置文件:

@Configuration 
@EnableWebMvc 
@ComponentScan({ 
     "ro.automotive.app.core.controller", 
     "ro.automotive.app.admin.controller", 
     "ro.automotive.app.autoService.controller", 
     "ro.automotive.app.carPartsSupplier.controller", 

     "ro.automotive.app.core.service", 
     "ro.automotive.app.core.DAO" 
}) 
@Import({CassandraConfig.class, SpringSecurityConfig.class}) 
public class AppConfig extends WebMvcConfigurerAdapter { 


    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/res/**/**.js").addResourceLocations("/WEB-RES/js/"); 
     registry.addResourceHandler("/res/**/**.css").addResourceLocations("/WEB-RES/css/"); 
     registry.addResourceHandler("/res/img/**/**/**.png").addResourceLocations("/WEB-RES/img/"); 
     registry.addResourceHandler("/**/**.ico").addResourceLocations("/WEB-RES/img/favicon.ico"); 
    } 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    @Bean 
    public ViewResolver viewResolver(ContentNegotiationManager manager) { 
     InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
     resolver.setPrefix("/views/"); 
     resolver.setSuffix(".jsp"); 
     return resolver; 
    } 


} 

卡桑德拉配置:

@Configuration 
public class CassandraConfig{ 

    @Bean 
    public Cluster cluster(){ 
     PoolingOptions poolingOptions = new PoolingOptions(); 
     Cluster cluster = Cluster.builder() 
       .withClusterName("develop") 
       .addContactPoint("localhost") 
       .withPort(9042) 
       .build(); 
     return cluster; 
    } 

    @Bean 
    public MappingManager mappingManager() throws Exception { 
     MappingManager mappingManager = new MappingManager(session()); 
     return mappingManager; 
    } 

    @Bean 
    public Session session() throws Exception { 
     Session session = cluster().connect("automotive"); 
     return session; 
    } 

} 

而且BaseDAO其中映射管理为空:

public abstract class BaseDAOImpl<T> implements BaseDAO<T> { 

    protected final Logger logger = LoggerFactory.getLogger(getClass()); 

    @Autowired 
    protected MappingManager manager; 

    protected Mapper<T> mapper; 

    public BaseDAOImpl(Class<T> clazz) { 
     mapper = manager.mapper(clazz); 
    } 

    @Override 
    public TableMetadata getTableMetadata() { 
     return mapper.getTableMetadata(); 
    } 

    @Override 
    public Statement saveQuery(T entity) { 
     return mapper.saveQuery(entity); 
    } 

    @Override 
    public Statement saveQuery(T entity, Mapper.Option... options) { 
     return mapper.saveQuery(entity, options); 
    } 

    @Override 
    public void save(T entity) { 
     mapper.save(entity); 
    } 

    @Override 
    public void save(T entity, Mapper.Option... options) { 
     mapper.save(entity, options); 
    } 

    @Override 
    public ListenableFuture<Void> saveAsync(T entity) { 
     return mapper.saveAsync(entity); 
    } 

    @Override 
    public ListenableFuture<Void> saveAsync(T entity, Mapper.Option... options) { 
     return mapper.saveAsync(entity, options); 
    } 

    @Override 
    public Statement getQuery(Object... objects) { 
     return mapper.getQuery(objects); 
    } 

    @Override 
    public T get(Object... objects) { 
     return mapper.get(objects); 
    } 

    @Override 
    public ListenableFuture<T> getAsync(Object... objects) { 
     return mapper.getAsync(objects); 
    } 

    @Override 
    public Statement deleteQuery(T entity, Mapper.Option... options) { 
     return mapper.deleteQuery(entity, options); 
    } 

    @Override 
    public Statement deleteQuery(T entity) { 
     return mapper.deleteQuery(entity); 
    } 

    @Override 
    public Statement deleteQuery(Object... objects) { 
     return mapper.deleteQuery(objects); 
    } 

    @Override 
    public void delete(T entity) { 
     mapper.delete(entity); 
    } 

    @Override 
    public void delete(T entity, Mapper.Option... options) { 
     mapper.delete(entity, options); 
    } 

    @Override 
    public ListenableFuture<Void> deleteAsync(T entity) { 
     return mapper.deleteAsync(entity); 
    } 

    @Override 
    public ListenableFuture<Void> deleteAsync(T entity, Mapper.Option... options) { 
     return mapper.deleteAsync(entity, options); 
    } 

    @Override 
    public void delete(Object... objects) { 
     mapper.delete(objects); 
    } 

    @Override 
    public ListenableFuture<Void> deleteAsync(Object... objects) { 
     return mapper.deleteAsync(objects); 
    } 

    @Override 
    public Result<T> map(ResultSet resultSet) { 
     return mapper.map(resultSet); 
    } 

    @Override 
    public ListenableFuture<Result<T>> mapAsync(ResultSetFuture resultSetFuture) { 
     return mapper.mapAsync(resultSetFuture); 
    } 

    @Override 
    public void setDefaultSaveOptions(Mapper.Option... options) { 
     mapper.setDefaultSaveOptions(options); 
    } 

    @Override 
    public void resetDefaultSaveOptions() { 
     mapper.resetDefaultSaveOptions(); 
    } 

    @Override 
    public void setDefaultGetOptions(Mapper.Option... options) { 
     mapper.setDefaultGetOptions(options); 
    } 

    @Override 
    public void resetDefaultGetOptions() { 
     mapper.resetDefaultGetOptions(); 
    } 

    @Override 
    public void setDefaultDeleteOptions(Mapper.Option... options) { 
     mapper.setDefaultDeleteOptions(options); 
    } 

    @Override 
    public void resetDefaultDeleteOptions() { 
     mapper.resetDefaultDeleteOptions(); 
    } 

    @Override 
    public T get(List objects) { 
     return mapper.get(objects.toArray()); 
    } 

    @Override 
    public ListenableFuture<T> getAsync(List objects) { 
     return mapper.getAsync(objects.toArray()); 
    } 
} 

这里是一个UserDAOImpl:

@Repository 
public class UsersDAOImpl extends BaseDAOImpl<Users> implements UsersDAO { 

    private UsersDAO accessor; 

    public UsersDAOImpl() { 
     super(Users.class); 
     accessor = manager.createAccessor(UsersDAO.class); 
    } 

    @Override 
    public Users findByUsername(String username) { 
     return accessor.findByUsername(username); 
    } 
} 

回答

3

您的问题是:

[ro.automotive.app.core.DAO.UsersDAOImpl]: Constructor threw exception; nested exception is java.lang.NullPointerException

如果春天实例化一个UsersDAOImpl经理的autowireBaseDAOImpl

@Autowired 
protected MappingManager manager; 

不执行在那一刻。这就是你获得NPE的原因。

所以做你mapper的初始化在@PostConstruct方法:

@PostConstruct 
public void init(){ 
    [...] 
} 

@PostConstruct是一样的东西AfterBeanIsReadyAndAllFieldsAreAutowired

编辑: 做这样的事情:

@Repository 
public abstract class BaseDAOImpl<T> implements BaseDAO<T> { 

    protected final Class<T> ENTITY_CLASS; 
    protected final Logger logger = LoggerFactory.getLogger(getClass()); 

    @Autowired 
    protected MappingManager manager; 

    protected Mapper<T> mapper; 

    public BaseDAOImpl() { 
     // get type of <T> hack... 
     this.ENTITY_CLASS = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 

    @PostConstruct 
    public void init(){ 
     mapper = manager.mapper(ENTITY_CLASS); 
    } 

    [...] 
}