2015-01-19 1 views
0

изначально, мы имели @Service и @Repository на один класс (так называемый DbHome), делая только CRUD операций. Каждая операция была запрограммирована @Transactional, что, очевидно, медленно.Ошибка создания боб с именем «БД» определены в файле [...]: Конкретизация боба не удалось (NullPointerException)

Так что я хочу, чтобы переместить @Transactional к классу (так называемый Db), где находятся несколько логических операций (как, или getDevices). Но я читал, что @Transactional может использоваться только в @Service. Поэтому я переехал @Service от DbHome до Db class.

Но теперь я получаю следующее исключение:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'db' defined in file [/home/pitel/tomcat/wtpwebapps/anna_controller/WEB-INF/classes/cz/master/anna/controller/dao/Db.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [cz.master.anna.controller.dao.Db]: Constructor threw exception; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1093) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1038) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    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:762) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4994) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [cz.master.anna.controller.dao.Db]: 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:1086) 
    ... 22 more 
Caused by: java.lang.NullPointerException 
    at cz.master.anna.controller.dao.Db.<init>(Db.java:68) 
    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) 
    ... 24 more 

начала Db класса:

@Service 
public class Db { 
    public static synchronized Db getInstance() { 
     if (instance == null) { 
      instance = new Db(); 
     } 
     return instance; 
    } 
    private static Db instance = null; 
    @Autowired 
    private ApplicationContext appContext; 

    private DbHome dbHome = null; 
    private Db() { 
     dbHome = (DbHome) ControllerConfig.getInstance().getAppContext().getBean("dbHome"); 
    } 

    // Normal methods are here 

} 

И в DbHome класс:

@Repository("dbHome") 
public class DbHome { 
    @Autowired(required=true) 
    private SessionFactory sessionFactory; 

    // CRUD methods are here 
} 

Я новичок Весна, так что, пожалуйста, помогите мне?

ответ

1

NullPointerException произошло в ControllerConfig.getInstance().getAppContext().getBean("dbHome")

Убедитесь, что ваш контекст приложения не null.

Лучшей практикой является то, что не создавайте instace для контекста приложения внутри конструктора, создайте его с помощью @Autowiring.

2

Проблема здесь:

@Autowired 
private ApplicationContext appContext; 

Этот компонент контекста приложения не будет не инициализировать до тех пор, пока это (DB) объект не полностью построен, и вы пытаетесь получить к нему доступ из конструктора и, следовательно, вы в конечном итоге с нулевым исключение указателя.

Если вам необходимо запустить некоторый код инициализации, вы должны вытащить код из конструктора в метод, и аннотировать этот метод с @PostConstruct

+0

Существует еще что-то не так ... Я изменил конструктор к этому: @PostConstruct \t частная пустота getDbHome() { \t \t dbHome = (dbHome) ControllerConfig.getInstance() getAppContext() getBean ("dbHome")..; \t} и я все еще получаю сообщение об ошибке. – Pitel

Смежные вопросы