【问题标题】:Integration jsf, spring, hibernate. How to inject Spring beans into JSF managed beans?集成jsf、spring、hibernate。如何将 Spring bean 注入 JSF 托管 bean?
【发布时间】:2014-07-01 13:33:14
【问题描述】:

我正在使用框架 JSF 2.1、Spring 3.1.1.Release、hibernate 3.2.1 开发一个 Java EE 项目。现在我正处于整合他们三个的阶段。 构建成功,我使用的是 tomcat server 7。但我在首页得到了这个异常。

Etat HTTP 500 -

type Rapport d''exception

message

description Le serveur a rencontré une erreur interne qui l''a empêché de satisfaire la requête.

exception

javax.servlet.ServletException
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:422)
cause mère

java.lang.NullPointerException
    controller.AnneeBean.getListeAnnees(AnneeBean.java:15)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:601)
    javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
    com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    org.apache.el.parser.AstValue.getValue(AstValue.java:183)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
    com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    javax.faces.component.UIData.getValue(UIData.java:731)
    javax.faces.component.UIData.getDataModel(UIData.java:1798)
    javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
    javax.faces.component.UIData.setRowIndex(UIData.java:473)
    com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
    javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
    javax.faces.component.UIData.encodeBegin(UIData.java:1118)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1754)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:410)
note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de Apache Tomcat/7.0.42.

休眠 hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/base?zeroDateTimeBehavior=convertToNull</property>
    <property name="hibernate.connection.username">root</property>
    <mapping resource="net/vo/Annee.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

hibernate.reveng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">
<hibernate-reverse-engineering>
  <schema-selection match-catalog="base"/>
  <table-filter match-name="annee"/>
</hibernate-reverse-engineering>

AnneeDao.java

package dao;

import java.util.List;
import net.vo.Annee;

public interface AnneeDao {
    public List getAllAnnees();
    public Annee getAnnee(Integer id);
    public void insert(Annee annee);
    public void update(Annee annee);
    public void delete(Integer id);
}

AnneeHibernateDao.java

package dao;

import java.util.List;
import net.vo.Annee;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class AnneeHibernateDao implements AnneeDao{
    private List<Annee> listeAnnees;
    private Annee annee;
    public void init()
    {
        System.out.println("Méthode d'initiation");
    }
    @Override
    public List getAllAnnees() {
        Session session=HibernateUtil.getSession();
        try
        {
            session.beginTransaction();
            listeAnnees = session.createQuery("from Annee").list();
            return listeAnnees;
        }
        catch(HibernateException e)
        {
            throw e;
        }
        finally
        {
            session.close();
        }
    }

    @Override
    public Annee getAnnee(Integer id) {
       Session session = HibernateUtil.getSession();
       try
       {
           session.beginTransaction();
           Query q = session.createQuery("from Annee as a where a.annee=" + id);
           return (Annee) q.uniqueResult();
       }
       finally
       {
           session.close();
       }
    }

    @Override
    public void insert(Annee annee) {

      Session session = HibernateUtil.getSession();
      Transaction tx=null;
      try
      {
          tx = session.beginTransaction();
          session.save(annee);
          tx.commit();         
      }
      catch(RuntimeException e)
      {
          if(tx != null) 
            {
                tx.rollback();
            }
          throw e;
      }
      finally
      {
          session.close();
      }
    }

    @Override
    public void update(Annee annee) {
        Session session = HibernateUtil.getSession();
        Transaction tx=null;
        try
        {
            tx=session.beginTransaction();
            session.update(annee);
            tx.commit();
        }
         catch(RuntimeException e)
         {
           if(tx != null) 
            {
                tx.rollback();
            }
            throw e;
         }
         finally
         {
            session.close();
         }
    }

    @Override
    public void delete(Integer id) {
       Session session = HibernateUtil.getSession();
       Transaction tx = null;
       try
       {
           tx=session.beginTransaction();
           annee = (Annee) session.get(Annee.class,id);
           session.delete(annee);
           tx.commit();
       }
       catch(RuntimeException e)
         {
            if(tx != null) 
            {
                tx.rollback();
            }
            throw e;
         }
         finally
         {
            session.close();
         }
    }


}

HibernateUtil.java

package dao;

import org.hibernate.Session;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

/**
 * Hibernate Utility class with a convenient method to get Session Factory
 * object.
 *
 * @author images
 */
public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from standard (hibernate.cfg.xml) 
            // config file.
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() {
        return sessionFactory.openSession();
    }
}

Pojo 文件

安妮.java

package net.vo;

public class Annee  implements java.io.Serializable {


     private int annee;

    public Annee() {
    }

    public Annee(int annee) {
       this.annee = annee;
    }

    public int getAnnee() {
        return this.annee;
    }

    public void setAnnee(int annee) {
        this.annee = annee;
    }




}

映射文件:Annee.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 13 mai 2014 18:23:22 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="net.vo.Annee" table="annee" catalog="base">
        <id name="annee" type="int">
            <column name="annee" />
            <generator class="assigned" />
        </id>
    </class>
</hibernate-mapping>

春天 AnneeMetier.java

package model.services;

import java.util.List;

public interface AnneeMetier {
    public List getAllAnnees();
}

AnneeMetierImpl.java

package model.services;

import dao.AnneeDao;
import java.util.List;
import net.vo.Annee;

public class AnneeMetierImpl implements AnneeMetier{

    private AnneeDao anneeDao;

    @Override
    public List getAllAnnees() {
            return anneeDao.getAllAnnees();
    }

    public void setAnneeDao(AnneeDao anneeDao) {
        this.anneeDao = anneeDao;
    }

    public AnneeDao getAnneeDao() {
        return anneeDao;
    }

}

JSF AnneeBean.java

package controller;

import java.util.List;
import model.services.AnneeMetier;
import net.vo.Annee;

public class AnneeBean {

    private AnneeMetier anneeMetier;

    private List<Annee> listeAnnees;

    public List getListeAnnees() {
        listeAnnees = anneeMetier.getAllAnnees();
        return listeAnnees;
    }

    public void setListeAnnees(List listeAnnees) {
        this.listeAnnees = listeAnnees;
    }

    public AnneeMetier getAnneeMetier() {
        return anneeMetier;
    }

    public void setAnneeMetier(AnneeMetier anneeMetier) {
        this.anneeMetier = anneeMetier;
    }

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
       <listener>
      <listener-class>
         org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>
   <listener>
      <listener-class>
         org.springframework.web.context.request.RequestContextListener
      </listener-class>
   </listener>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"
       xmlns:context="http://www.springframework.org/schema/context/spring-context-3.1.xsd"
       xmlns:tx="http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
          http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/aop/spring-aop-3.1.xsd/spring-spring-aop-3.1.xsd-3.1.1.RELEASE.xsd
          http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/context/spring-context-3.1.xsd/spring-spring-context-2.5.xsd-3.1.1.RELEASE.xsd
          http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/tx/spring-tx-3.1.xsd/spring-spring-tx-3.1.xsd-3.1.1.RELEASE.xsd
">
     <bean id="anneeDao" class="dao.AnneeHibernateDao"></bean>
    <bean id="anneeMetier" class="model.services.AnneeMetierImpl">
        <property name="anneeDao" ref="anneeDao"/>  
    </bean>  

</beans>

faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.1"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd">

<application>
   <variable-resolver>
      org.springframework.web.jsf.DelegatingVariableResolver
   </variable-resolver>
</application>
 <managed-bean>
      <managed-bean-name>anneeBean</managed-bean-name>
      <managed-bean-class>controller.AnneeBean</managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
   </managed-bean> 
</faces-config>

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:dataTable var="annees" value="#{anneeBean.listeAnnees}">
                    <p:column headerText="Annee">
                        <h:outputText value="#{annee.annees}"/>
                    </p:column>
                </h:dataTable>
    </h:body>
</html>

请你帮帮我,我会很感激的

编辑: 这是更新的堆栈跟踪

mai 14, 2014 1:14:41 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/testJSF_Spring_Hibernate] threw exception [Erreur lors de linjection de ressources dans le bean géré anneeBean] with root cause
java.lang.NullPointerException
    at model.services.AnneeMetierImpl.getAllAnnees(AnneeMetierImpl.java:17)
    at controller.AnneeBean.init(AnneeBean.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.sun.faces.vendor.WebContainerInjectionProvider.invokeAnnotatedMethod(WebContainerInjectionProvider.java:117)
    at com.sun.faces.vendor.WebContainerInjectionProvider.invokePostConstruct(WebContainerInjectionProvider.java:99)
    at com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:223)
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:105)
    at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
    at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
    at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at com.sun.faces.el.ChainAwareVariableResolver.resolveVariable(ChainAwareVariableResolver.java:107)
    at org.springframework.web.jsf.DelegatingVariableResolver.resolveOriginal(DelegatingVariableResolver.java:123)
    at org.springframework.web.jsf.DelegatingVariableResolver.resolveVariable(DelegatingVariableResolver.java:108)
    at com.sun.faces.el.VariableResolverChainWrapper.getValue(VariableResolverChainWrapper.java:115)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:72)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:161)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    at javax.faces.component.UIData.getValue(UIData.java:731)
    at javax.faces.component.UIData.getDataModel(UIData.java:1798)
    at javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
    at javax.faces.component.UIData.setRowIndex(UIData.java:473)
    at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
    at javax.faces.component.UIData.encodeBegin(UIData.java:1118)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1754)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

编辑 2: 这是 AnneeBean 类

package controller;

import java.util.List;
import javax.annotation.PostConstruct;
import model.services.AnneeMetier;
import model.services.AnneeMetierImpl;
import net.vo.Annee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("view")
public class AnneeBean {

    @Autowired
    private AnneeMetier anneeMetier;

    private List<Annee> listeAnnees;

    @PostConstruct
    public void init() {
        anneeMetier = new AnneeMetierImpl();
        listeAnnees = anneeMetier.getAllAnnees();
    }
    public List getListeAnnees() {
        listeAnnees = anneeMetier.getAllAnnees();
        return listeAnnees;
    }

    public void setListeAnnees(List listeAnnees) {
        this.listeAnnees = listeAnnees;
    }

    public AnneeMetier getAnneeMetier() {
        return anneeMetier;
    }

    public void setAnneeMetier(AnneeMetier anneeMetier) {
        this.anneeMetier = anneeMetier;
    }

}

编辑 3: index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
 <h:form>
     <p:dataTable var="listeAnnees" value="#{anneeBean.listeAnnees}">
                <p:column headerText="Annee">
                    <h:outputText value="#{listeAnnees.annee}"/>
                    </p:column>
            </p:dataTable>        
        </h:form>
    </h:body>
</html>

【问题讨论】:

  • 在 index.xhtml 中,我调用了方法 getListAnnee,它位于 bean AnneeBean.java public List getListeAnnees() { listeAnnees = anneeMetier.getAllAnnees(); //这里我调用spring方法return listeAnnees; }
  • 在 AnneeBean.getListeAnnees 中似乎“anneeMetier”为空。您应该在初始化时为其设置一个空列表或进行空检查。

标签: java spring hibernate jsf jakarta-ee


【解决方案1】:

对于非 JSF 开发人员来说,天真的解决方案是简单地初始化 getter 中的变量以解析属性中的 null 值。这是:

public List getListeAnnees() {
    listeAnnees = getAnneeMetier().getAllAnnees();
    return listeAnnees;
}

public AnneeMetier getAnneeMetier() {
    if (anneeMetier == null) {
        anneeMetier = new AnneeMetierImpl();
    }
    return anneeMetier;
}

但是如果AnneeMetier#getAllAnnees() 从数据库中检索数据,这可能会从服务器产生大量开销。这在这里解释:Why JSF calls getters multiple times

要解决这个问题,你要做两件事:

  1. Define the right scope of your bean
  2. 使用@PostConstruct注解方法初始化工作所需的数据。

这会导致:

  1. 将范围定义为@ViewScoped(在上面的链接中说明)。
  2. @PostConstruct 方法中初始化listeAnnees
  3. 从 getter/setter 中删除任何业务逻辑

所以代码应该是这样的:

@ManagedBean
@ViewScoped
public class AnneeBean {
    private AnneeMetier anneeMetier;
    private List<Annee> listeAnnees;

    @PostConstruct
    public void init() {
        anneeMetier = new AnneeMetierImpl();
        listeAnnees = anneeMetier.getAllAnnees();
    }

    public List getListeAnnees() {
        return listeAnnees;
    }

    public void setListeAnnees(List listeAnnees) {
        this.listeAnnees = listeAnnees;
    }

    public AnneeMetier getAnneeMetier() {
        return anneeMetier;
    }

    public void setAnneeMetier(AnneeMetier anneeMetier) {
        this.anneeMetier = anneeMetier;
    }
}

但是因为您正在尝试将 JSF 与 Spring 集成,所以您必须考虑到 Spring has not yet full support of JSF 2 @ViewScoped annotation。对于这种情况,您必须/需要自己实现它。网上有很多关于这个的例子,看起来最受欢迎的是来自Cagatay's。通过这种方式,您将能够从双方获得力量。您的 bean 将如下所示:

@Component
@Scope("view")
public class AnneeBean {
    @Autowired
    private AnneeMetier anneeMetier;
    private List<Annee> listeAnnees;

    @PostConstruct
    public void init() {
        listeAnnees = anneeMetier.getAllAnnees();
    }

    public List getListeAnnees() {
        return listeAnnees;
    }

    public void setListeAnnees(List listeAnnees) {
        this.listeAnnees = listeAnnees;
    }
}

更多信息:


既然您正在学习 Spring,最好的办法是启用组件扫描并使用注释来配置您的 Spring bean。执行以下操作:

  • 删除 applicationContext.xml 中的所有 bean 配置。
  • 添加此配置以启用 bean 扫描注释:

    <!-- 
        These will enable component scan by annotation configuration
        rather than XML configuration. One per package
    -->
    <context:component-scan base-package="dao" />
    <context:component-scan base-package="model.services" />
    

    或者如果你所有的类都在一个根包中。

    <!--
        Assuming there's a root package for your packages like this
    <context:component-scan base-package="com.myproject.dao" />
    <context:component-scan base-package="com.myproject.model.services" />
    -->
    <context:component-scan base-package="com.myproject" />
    
  • 开始通过注解配置你的 Spring 托管 bean:

    @Repository
    public class AnneeHibernateDao implements AnneeDao{
        //...
    }
    
    @Service
    public class AnneeMetierImpl implements AnneeMetier{
        @Autowired
        private AnneeDao anneeDao;
        //...
    }
    

编译您的项目并运行它。

【讨论】:

  • 我添加了stacktrace,你现在可以看到了
  • @Marina 奇怪的是你没有在你的 spring applicationContext.xml 中启用context。您使用的是哪个版本的 Spring?
  • 我正在使用 spring 3.1.1.RELEASE
  • 请检查如何在您的项目中启用组件扫描。如果这不起作用,请在您的项目中再次手动配置每个 Spring bean:AnneeHibertnateDao 和 AnneeMetierImpl。
  • 我添加了 并且我更改了 applicationContext 的根元素,现在构建成功但我认为与以前相同的错误。我会给你看日志
【解决方案2】:

您正在使用getListeAnnees,您打算在其中调用private object 的一个名为anneeMetier 的方法,该方法尚未初始化。您通过您的setAnneeMetier 方法初始化object,该方法从未在您的代码中初始化,因此它是null。您可以通过执行以下操作之一来解决您的问题:

  1. 在使用getListeAnnees之前通过调用setAnneeMetier来初始化anneeMetier

  2. 您为 AnneeBean 类实现了一个构造函数,并在其中初始化 anneeMetier

  3. 你修改你的getter(getListeAnnees)如下:

    public List getListeAnnees() { if (anneeMetier == null) { return new ArrayList<Annee>(); } listeAnnees = anneeMetier.getAllAnnees(); return listeAnnees; }

编辑:pL4GU33 的评论可能有用,所以我将他的评论想法添加到答案中:

public List getListeAnnees() { if (anneeMetier == null) { return Collections.emptyList(); } listeAnnees = anneeMetier.getAllAnnees(); return listeAnnees; }

他的解决方案与类型无关,所以我赞成他的评论。

【讨论】:

  • 对于 3,我更喜欢返回 Collections.emptyList()。 docs.oracle.com/javase/7/docs/api/java/util/… 而不是 new ArrayList()
  • 如果您以前使用过 JSF 2,您就会知道这不是正确的解决方案。
  • @LuiggiMendoza,你能详细说明你的评论吗?这些建议有什么问题?
  • 阅读此处:Why JSF calls getters multiple times。由于 bean 是请求范围的,因此这样做意味着在每次请求时从数据库中检索对象(不希望 IMO)。
  • 这是对的,确实是不可取的,但是,问题是关于有一个 NullPointerException,而不是关于最小化请求的数量。所以你的观点是正确的,但我不确定如果我们在修复 NullPointerException 之前优化他/她的方法,我们是否会帮助操作员。此外,在插入、更新和删除频繁的情况下,每次请求都从数据库中获取资源可能很有用。
猜你喜欢
  • 2016-05-27
相关资源
最近更新 更多