2010-11-20 7 views
0

Je suis nouveau à Spring et Hibernate. J'ai essayé de créer une application simple en utilisant JSF, Spring et Hibernate. Quand je suis essayer de lancer l'application via Eclipse, je reçois cette erreurbeaninstantiationexception en utilisant le printemps avec jsf

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 

partie pertinente de la vue

<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}" /> 

Ceci est mon AddressBean

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

et voici mon applicationcontext.xml code

<!-- 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> 

Veuillez corriger mon erreur. S'il vous plaît me mettre à jour s'il manque des détails.

Mise à jour @chkal J'ai essayé que vous avez dit et ce suivi tutorial et modifié le fichier applicationContext.xml comme ci-dessous

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

Maintenant, l'erreur se présente comme suit

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.... 

Si je suis complètement faux, s'il vous plaît me suggérer un bon tutoriel pour un débutant comme moi

Merci d'avance

Répondre

2

Il semble que vous essayez d'utiliser des beans gérés par JSF standard et une solution de contournement pour obtenir des références aux beans gérés par Spring (comme le DAO).

Cette méthode n'est pas conseillée. Vous devriez vraiment jeter un oeil à la JSF integration of Spring. Si vous utilisez cette méthode, vous n'aurez pas du tout besoin d'utiliser les beans gérés JSF. Vous déclarerez simplement vos beans JSF comme des beans Spring réguliers et pourrez y accéder en utilisant des expressions EL comme les beans gérés par JSF. Ensuite, vous pouvez également utiliser @Autowired pour injecter d'autres beans Spring (comme votre DAO) dans votre bean JSF.

Ajouter ceci à votre faces-config.xml:

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

Ensuite, changez votre AddressBean à quelque chose comme ceci:

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

    @Autowired 
    private AddressDAO dao; 

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

} 

Vous ne même pas à changer votre point de vue, comme cet exemple ajoutera la AddressBean au contexte EL sous le nom addressBean.

+0

Merci pour votre réponse. Je vais travailler avec les changements suggérés par vous et revenir – mvg

+0

Désolé, j'ai fait des modifications suggérées par vous, toujours l'erreur persiste – mvg

+0

Mais le NPE vient de FacesUtil! Si vous suivez mes suggestions, vous n'aurez plus besoin d'utiliser FacesUtil. – chkal

Questions connexes