Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 集成jsf、spring、hibernate。如何将springbean注入JSF管理的bean?_Java_Spring_Hibernate_Jsf_Jakarta Ee - Fatal编程技术网

Java 集成jsf、spring、hibernate。如何将springbean注入JSF管理的bean?

Java 集成jsf、spring、hibernate。如何将springbean注入JSF管理的bean?,java,spring,hibernate,jsf,jakarta-ee,Java,Spring,Hibernate,Jsf,Jakarta Ee,我正在使用JSF2.1、Spring3.1.1.Release和Hibernate3.2.1框架进行JavaEE项目。现在我正处于整合这三个方面的阶段。 构建成功,我使用tomcat服务器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

我正在使用JSF2.1、Spring3.1.1.Release和Hibernate3.2.1框架进行JavaEE项目。现在我正处于整合这三个方面的阶段。 构建成功,我使用tomcat服务器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>
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();
         }
    }


}
Pojo文件

Annee.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>
anneemeterimpl.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;
    }

}
编辑2: 这是安尼班

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

}
包装控制器;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入model.services.annemetier;
导入model.services.anneemeteriempl;
导入net.vo.Annee;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.context.annotation.Scope;
导入org.springframework.stereotype.Component;
@组成部分
@范围(“视图”)
公营安尼班{
@自动连线
私人安妮米特尔安妮米特尔;
私人名单名单;
@施工后
公共void init(){
AnneMetier=新的AnneMetierimpl();
listenenes=annemetier.getAllAnnees();
}
公共列表getListenees(){
listenenes=annemetier.getAllAnnees();
回归李斯特尼斯;
}
公共无效集合列表项(列表列表项){
this.listenenes=listenenes;
}
公共AnneMetier GetAnneMetier(){
返回退火机;
}
公共无效SetAnneMetier(AnneMetier AnneMetier){
this.annemetier=annemetier;
}
}
编辑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">
    <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>
<?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>

Facelet标题

您正在使用
getlistenees
来调用名为
annemetier
私有对象的方法,该方法尚未初始化。您可以通过
setAnneMetier
方法初始化该
对象,该方法从未在代码中初始化过,因此它是
null
。您可以通过执行以下操作之一来解决问题:

  • 在使用
    getListenees

  • 您为您的
    AnneeBean
    类实现了一个构造函数,在该类中初始化
    anneetemier

  • 您可以将getter(
    getListenes
    )修改为如下所示:

    public List getlistenees(){
    如果(AnneMetier==null){
    返回新的ArrayList();
    }
    listenenes=annemetier.getAllAnnees();
    回归李斯特尼斯;
    }

  • 编辑:pL4GU33的评论可能很有用,因此我在答案中添加了他的评论:

    public List getlistenees(){
    如果(AnneMetier==null){
    返回集合。emptyList();
    }
    listenenes=annemetier.getAllAnnees();
    回归李斯特尼斯;
    }


    他的解决方案更不区分类型,所以我支持他的评论。

    您使用的是
    getListenees
    ,您打算调用名为
    AnneMetier
    私有
    对象的方法,该方法尚未初始化。您可以通过
    setAnneMetier
    方法初始化该
    对象,该方法从未在代码中初始化过,因此它是
    null
    。您可以通过执行以下操作之一来解决问题:

  • 在使用
    getListenees

  • 您为您的
    AnneeBean
    类实现了一个构造函数,在该类中初始化
    anneetemier

  • 您可以将getter(
    getListenes
    )修改为如下所示:

    public List getlistenees(){
    如果(AnneMetier==null){
    返回新的ArrayList();
    }
    listenenes=annemetier.getAllAnnees();
    回归李斯特尼斯;
    }

  • 编辑:pL4GU33的评论可能很有用,因此我在答案中添加了他的评论:

    public List getlistenees(){
    如果(AnneMetier==null){
    返回集合。emptyList();
    }
    listenenes=annemetier.getAllAnnees();
    回归李斯特尼斯;
    }


    他的解决方案更不区分类型,所以我支持他的评论。

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

    public List getListeAnnees() {
        listeAnnees = getAnneeMetier().getAllAnnees();
        return listeAnnees;
    }
    
    public AnneeMetier getAnneeMetier() {
        if (anneeMetier == null) {
            anneeMetier = new AnneeMetierImpl();
        }
        return anneeMetier;
    }
    
    但是,如果
    annemetier#getAllAnnees()
    从数据库检索数据,这可能会从服务器上产生大量开销。这里解释如下:

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

  • 使用
    @PostConstruct
    带注释的方法初始化工作所需的数据
  • 这将导致:

  • 将范围定义为
    @ViewScoped
    (在上面的链接中解释)
  • @PostConstruct
    方法中初始化
    列表项
  • 从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;
        }
    }
    
    @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,所以最好启用组件扫描并使用注释来配置Springbean。请执行以下操作:

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

      @Repository
      public class AnneeHibernateDao implements AnneeDao{
          //...
      }
      
      @Service
      public class AnneeMetierImpl implements AnneeMetier{
          @Autowired
          private AnneeDao anneeDao;
          //...
      }
      
      
      
      或者如果所有类都在一个根包中

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

    编译您的项目并运行它。

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

    public List getListeAnnees() {
        listeAnnees = getAnneeMetier().getAllAnnees();
        return listeAnnees;
    }
    
    public AnneeMetier getAnneeMetier() {
        if (anneeMetier == null) {
            anneeMetier = new AnneeMetierImpl();
        }
        return anneeMetier;
    }
    
    但在
    annemetier#get的情况下,这可能会从服务器产生大量开销
    
    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;
        }
    
    }
    
    <?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>
    
    public List getListeAnnees() {
        listeAnnees = getAnneeMetier().getAllAnnees();
        return listeAnnees;
    }
    
    public AnneeMetier getAnneeMetier() {
        if (anneeMetier == null) {
            anneeMetier = new AnneeMetierImpl();
        }
        return anneeMetier;
    }
    
    @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;
        }
    }
    
    @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;
        }
    }
    
    <!--
        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" />
    
    @Repository
    public class AnneeHibernateDao implements AnneeDao{
        //...
    }
    
    @Service
    public class AnneeMetierImpl implements AnneeMetier{
        @Autowired
        private AnneeDao anneeDao;
        //...
    }