Spring没有初始化bean

时间:2016-11-30 11:07:10

标签: java spring spring-mvc cassandra datastax-java-driver

我想更改我的应用访问cassandra db的方式。我正在使用spring数据用于cassandra,但因为它不支持UDT和其他东西我决定使用带有DAO模式的数据驱动程序。

但我有一些问题,psring没有初始化数据存储驱动程序的bean,我也不知道错误在哪里。

这是错误:

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;
    }


}

Cassandra配置:

@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,其中映射管理器为null:

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);
    }
}

1 个答案:

答案 0 :(得分:3)

你的问题是:

  

[ro.automotive.app.core.DAO.UsersDAOImpl]:构造函数抛出异常;嵌套异常是java.lang.NullPointerException

如果Spring在您的 BaseDAOImpl 中实例化UsersDAOImpl经理的autowire

@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);
    }

    [...]
}