2010-11-20 5 views
0

私はSpringとHibernateを初めて使用しています。私は、JSF、Spring、およびHibernateを使用して簡単なアプリケーションを作成しようとしました。私は、Eclipseを介してアプリケーションを実行しようとしていたとき、私はこのエラーを取得していますビューのjsfでspringを使用した場合のbeaninstantiationexception

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AddressBean' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.address.AddressBean]: Constructor threw exception; nested exception is java.lang.NullPointerException 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:883) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:839) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) 
at java.security.AccessController.doPrivileged(Native Method) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381) 
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255) 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972) 
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
at org.apache.catalina.core.StandardHost.start(StandardHost.java:785) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 
at org.apache.catalina.core.StandardService.start(StandardService.java:519) 
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) 
at org.apache.catalina.startup.Catalina.start(Catalina.java:581) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) 
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 


Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.address.AddressBean]: Constructor threw exception; nested exception is java.lang.NullPointerException 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:115) 
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877) 
... 31 more 
Caused by: java.lang.NullPointerException 
at com.util.FacesUtil.getServletContext(FacesUtil.java:33) 
at com.address.AddressBean.<init>(AddressBean.java:19) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100) 
... 33 more 

関連部分は

<h:outputText value="Address:"/> 
      <h:inputText value="#{addressBean.address.address}"/><br /> 
      <h:outputText value="City:"/> 
      <h:inputText value="#{addressBean.address.city}"/><br /> 
      <h:outputText value="Contact Id:"/> 
      <h:inputText value="#{addressBean.address.contactId}"/><br /> 
      <h:outputText value="Country:"/> 
      <h:inputText value="#{addressBean.address.country}"/><br /><br /> 
      <h:commandButton value="Submit" action="#{addressBean.addAddress}" /> 

これは私のAddressBean

public AddressBean() 
{ 
    ServletContext servletContext = FacesUtil.getServletContext(); 
    this.context = WebApplicationContextUtils 
      .getRequiredWebApplicationContext(servletContext); 
} 
public String addAddress() 
{ 
    dao = (AddressDAOImpl)context.getBean("AddressDAOImpl"); 
    dao.saveAddress(address); 
    return ""; 
} 

であり、これは私ですapplicationcontext.xmlコード

<!-- Hibernate SessionFactory Definition --> 
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="mappingResources"> 
     <list> 
      <value> 
       com/address/Address.hbm.xml 
      </value>     
     </list> 
    </property> 

    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect"> 
       org.hibernate.dialect.MySQLDialect 
      </prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.cglib.use_reflection_optimizer"> 
       true 
      </prop> 
      <prop key="hibernate.cache.provider_class"> 
       org.hibernate.cache.HashtableCacheProvider 
      </prop> 
      <prop key="hibernate.connection.useUnicode">true</prop> 
      <prop key="hibernate.connection.characterEncoding">UTF-8</prop> 
     </props> 
    </property> 

    <property name="dataSource"> 
     <ref bean="dataSource" /> 
    </property> 
</bean> 

<!-- Spring Data Access Exception Translator Definition --> 
<bean id="jdbcExceptionTranslator" 
    class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator"> 
    <property name="dataSource"> 
     <ref bean="dataSource" /> 
    </property> 
</bean> 

<!-- Hibernate Template Definition --> 
<bean id="hibernateTemplate" 
    class="org.springframework.orm.hibernate3.HibernateTemplate"> 
    <property name="sessionFactory"> 
     <ref bean="sessionFactory" /> 
    </property> 
    <property name="jdbcExceptionTranslator"> 
     <ref bean="jdbcExceptionTranslator" /> 
    </property> 
</bean> 


<bean id="AddressBean" 
    class="com.address.AddressBean"> 
    <property name="hibernateTemplate"> 
     <ref bean="hibernateTemplate" /> 
    </property> 
    <property name="addressDAO"> 
     <ref bean="addressDAO" /> 
    </property> 
    <property name="sessionFactory"> 
     <ref local="sessionFactory" /> 
    </property> 
</bean> 

<!-- ========================= Start of SERVICE DEFINITIONS ========================= 
--> 

<!-- Hibernate Transaction Manager Definition --> 
<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref local="sessionFactory" /> 
    </property> 
</bean> 

私の間違いを訂正してください。詳細を見逃しても私を更新してください。

更新あなたが言ったと、このtutorialを踏襲している場合

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dao' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.address.AddressDAO]: Specified class is an interface 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:883) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:839) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) 
at java.security.AccessController.doPrivileged(Native Method) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) 
at org.springframework.beans.factory.support.AbstractBeanFact.... 

を次のように今すぐエラーが来る

<bean id="dao" class="com.address.AddressDAO">      
</bean> 
<bean id="addressBean" 
    class="com.address.AddressBean"> 
    <property name="dao"> 
     <ref local="dao" /> 
    </property>     
</bean> 

以下のようにapplicationContext.xmlをファイルを変更して、私が試した @chkal I完全に間違っている、私のような初心者のための良いチュートリアルをお勧めします

ありがとうございます

答えて

2

通常のJSFマネージドBeanを使用しようとしているようで、Springが管理するBean(DAOなど)への参照を取得するための回避策があるようです。

これはこれを処理する推奨方法ではありません。実際にはJSF integration of Springをご覧ください。この方法を使用している場合は、JSFマネージドBeanをまったく使用する必要はありません。 JSF Beanを通常のSpring Beanとして宣言するだけで、通常のJSFマネージドBeanと同じようにEL式を使用してアクセスできます。次に、@Autowiredを使用して、他のSpring Bean(DAOなど)をJSF Beanに挿入することもできます。

あなたfaces-config.xmlにこれを追加します。

<faces-config> 
    <application> 
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
    </application> 
</faces-config> 

次に、このような何かにあなたのAddressBeanを変更します。この例では、追加されますようあなたも、あなたのビューを変更する必要はありません

@Component("addressBean") 
@Scope("request") 
public class AddressBean { 

    @Autowired 
    private AddressDAO dao; 

    public String addAddress() 
    { 
     dao.saveAddress(address); 
     return ""; 
    } 

} 

ELコンテキストにaddressBeanの名前でAddressBeanを追加します。

+0

あなたの答えをありがとう。私はあなたから提案された変更を使用して作業します – mvg

+0

申し訳ありませんが、私はあなたによって提案された変更を加えましたが、それでもエラーが続く – mvg

+0

しかし、NPEはFacesUtilから来ます!あなたが私の提案に従えば、FacesUtilをまったく使用する必要はありません。 – chkal