2012-09-05 48 views
0

我现在挂断了Spring和JSF的集成。我认为我错误地配置了一些东西,我无法看到究竟是什么。我得到一个NULL指针异常,因为服务层不会被JSF Bean加载。我的配置如下:Spring和JSF--依赖注入失败ServiceBean无法加载

堆栈跟踪

java.lang.NullPointerException 
    at com.speterit.auftragssystem.beans.MitarbeiterBean.getMitarbeiterList(MitarbeiterBean.java:27) 
    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:616) 
    at javax.el.BeanELResolver.invoke(BeanELResolver.java:484) 
    at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:161) 
    at org.apache.el.parser.AstValue.getValue(AstValue.java:159) 
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189) 
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:106) 
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190) 
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178) 
    at javax.faces.component.UIData.getValue(UIData.java:553) 
    at javax.faces.component.UIData.getDataModel(UIData.java:1293) 
    at javax.faces.component.UIData.setRowIndex(UIData.java:446) 
    at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:77) 
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:824) 
    at javax.faces.component.UIData.encodeBegin(UIData.java:936) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1661) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1666) 
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1666) 
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:389) 
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127) 
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:335) 
    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:225) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    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:679) 

default.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:f="http://java.sun.com/jsf/core"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<h:head> 

</h:head> 
</head> 
<h:body> 
    #{mitarbeiterBean.getServiceMitarbeiter() ne null ? "true" : "false"}<br /> 
    <h:dataTable value="#{mitarbeiterBean.getMitarbeiterList()}" var="m"> 
     <h:column> 
      <f:facet name="header">Vorname</f:facet> 
         #{m.vorname} 
       </h:column> 
     <h:column> 
      <f:facet name="header">Nachname</f:facet> 
         #{m.nachname} 
       </h:column> 
     <h:column> 
      <f:facet name="header">Geburtsdatum</f:facet> 
         #{m.geburtsdatum} 
       </h:column> 
    </h:dataTable> 
</h:body> 

的评价时,我没有数据表的一部分执行的代码#{mitarbeiterBean.getServiceMitarbeiter() ne null ? "true" : "false"}<br />是给假。

MitarbeiterBean.java

package com.speterit.auftragssystem.beans; 

import java.io.Serializable; 
import java.util.Date; 
import java.util.List; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 

import com.speterit.auftragssystem.data.model.Mitarbeiter; 
import com.speterit.auftragssystem.data.service.IServiceMitarbeiter; 

@ManagedBean(name = "mitarbeiterBean") 
@RequestScoped 
public class MitarbeiterBean implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    public IServiceMitarbeiter serviceMitarbeiter; 
    public String vorname; 
    public String nachname; 
    public Date geburtsdatum; 

    public List<Mitarbeiter> getMitarbeiterList() 
    { 
     return getServiceMitarbeiter().retrieveAllMitarbeiter(); 
    } 

    public void addMitarbeiter() 
    { 
     Mitarbeiter mitarbeiter = new Mitarbeiter(getVorname(), getNachname(), 
       getGeburtsdatum()); 

     getServiceMitarbeiter().createMitarbeiter(mitarbeiter); 

     clearForm(); 
    } 

    public void clearForm() 
    { 
     setVorname(""); 
     setNachname(""); 
     setGeburtsdatum(null); 
    } 

    public String getVorname() 
    { 
     return vorname; 
    } 

    public void setVorname(String vorname) 
    { 
     this.vorname = vorname; 
    } 

    public String getNachname() 
    { 
     return nachname; 
    } 

    public void setNachname(String nachname) 
    { 
     this.nachname = nachname; 
    } 

    public Date getGeburtsdatum() 
    { 
     return geburtsdatum; 
    } 

    public void setGeburtsdatum(Date geburtsdatum) 
    { 
     this.geburtsdatum = geburtsdatum; 
    } 

    public IServiceMitarbeiter getServiceMitarbeiter() 
    { 
     return serviceMitarbeiter; 
    } 

    public void setServiceMitarbeiter(IServiceMitarbeiter serviceMitarbeiter) 
    { 
     this.serviceMitarbeiter = serviceMitarbeiter; 
    } 
} 

servlet的context.xml中

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

    <!-- DispatcherServlet Context: defines this servlet's request-processing 
     infrastructure --> 

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
     up static resources in the ${webappRoot}/resources directory --> 
    <resources mapping="/resources/**" location="/resources/" /> 

    <!-- Hibernate --> 
    <beans:bean id="hibernateSessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <beans:property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
     <beans:property name="configurationClass" 
      value="org.hibernate.cfg.AnnotationConfiguration" /> 
     <beans:property name="hibernateProperties"> 
      <beans:props> 
       <beans:prop key="hibernate.show_sql">true</beans:prop> 
       <beans:prop key="hibernate.hbm2ddl.auto">create</beans:prop> 
       <beans:prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect 
       </beans:prop> 
       <beans:prop key="hibernate.c3p0.min_size">5</beans:prop> 
       <beans:prop key="hibernate.c3p0.max_size">20</beans:prop> 
       <beans:prop key="hibernate.c3p0.timeout">1800</beans:prop> 
       <beans:prop key="hibernate.c3p0.max_statements">50</beans:prop> 
      </beans:props> 
     </beans:property> 
    </beans:bean> 

    <tx:annotation-driven transaction-manager="transactionManager" /> 
    <beans:bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <beans:property name="sessionFactory" ref="hibernateSessionFactory" /> 
    </beans:bean> 

    <!-- Model Declaration --> 
    <beans:bean id="Mitarbeiter" class="com.speterit.auftragssystem.data.model.Mitarbeiter"/> 

    <!-- DAO Declaration --> 
    <beans:bean id="DaoMitarbeiter" class="com.speterit.auftragssystem.data.dao.DaoMitarbeiter"> 
     <beans:property name="sessionFactory" ref="SessionFactory" /> 
    </beans:bean> 

    <!-- Service Declaration --> 
    <beans:bean id="ServiceMitarbeiter" class="com.speterit.auftragssystem.data.service.ServiceMitarbeiter"> 
     <beans:property name="daoMitarbeiter" ref="DaoMitarbeiter" /> 
    </beans:bean> 

faces-config.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<faces-config 
    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_0.xsd" 
    version="2.0"> 

    <application> 
     <el-resolver> 
      org.springframework.web.jsf.el.SpringBeanFacesELResolver 
     </el-resolver> 
    </application> 
    <managed-bean> 
     <managed-bean-name>mitarbeiterBean</managed-bean-name> 
     <managed-bean-class>com.speterit.auftragssystem.beans.MitarbeiterBean</managed-bean-class> 
     <managed-bean-scope>session</managed-bean-scope> 
     <managed-property> 
      <property-name>serviceMitarbeiter</property-name> 
      <value>#{ServiceMitarbeiter}</value> 
     </managed-property> 
    </managed-bean> 
</faces-config> 

IServiceMitarbeiter.java

包com.speterit。 auftr agssystem.data.service;

import java.util.List; 

import com.speterit.auftragssystem.data.dao.IDaoMitarbeiter; 
import com.speterit.auftragssystem.data.model.Mitarbeiter; 

public interface IServiceMitarbeiter 
{ 
    public List<Mitarbeiter> retrieveAllMitarbeiter(); 
    public Mitarbeiter retrieveMitarbeiter(long personalnummer); 
    public Mitarbeiter createMitarbeiter(Mitarbeiter mitarbeiter); 
    public Mitarbeiter updateMitarbeiter(Mitarbeiter mitarbeiter); 
    public IDaoMitarbeiter getDaoMitarbeiter(); 
    public void setDaoMitarbeiter(IDaoMitarbeiter daoMitarbeiter); 
} 

ServiceMitarbeiter.java

package com.speterit.auftragssystem.data.service; 

import java.util.List; 

import org.springframework.transaction.annotation.Transactional; 

import com.speterit.auftragssystem.data.dao.IDaoMitarbeiter; 
import com.speterit.auftragssystem.data.model.Mitarbeiter; 

@Transactional(readOnly = true) 
public class ServiceMitarbeiter implements IServiceMitarbeiter 
{ 
    IDaoMitarbeiter daoMitarbeiter; 

    @Transactional(readOnly = true) 
    public List<Mitarbeiter> retrieveAllMitarbeiter() 
    { 
     return daoMitarbeiter.getAll(); 
    } 

    @Transactional(readOnly = true) 
    public Mitarbeiter retrieveMitarbeiter(long personalnummer) 
    { 
     return daoMitarbeiter.getByPersonalnummer(personalnummer); 
    } 

    @Transactional(readOnly = false) 
    public Mitarbeiter createMitarbeiter(Mitarbeiter mitarbeiter) 
    { 
     return daoMitarbeiter.create(mitarbeiter); 
    } 

    @Transactional(readOnly = false) 
    public Mitarbeiter updateMitarbeiter(Mitarbeiter mitarbeiter) 
    { 
     return daoMitarbeiter.persistOrMerge(mitarbeiter); 
    } 

    public IDaoMitarbeiter getDaoMitarbeiter() 
    { 
     return daoMitarbeiter; 
    } 

    public void setDaoMitarbeiter(IDaoMitarbeiter daoMitarbeiter) 
    { 
     this.daoMitarbeiter = daoMitarbeiter; 
    } 
} 

我很高兴,每快速线索:)因为我没有想法了

回答

0

随着org.springframework.web.jsf.el.SpringBeanFacesELResolver你的类必须是一个简单的 Spring组件。删除@ManagedBean并添加@Component注释。

您已经创建了另一个由JSF通过@ManagedBean注释管理的MitarbeiterBean实例,它与Spring管理的Bean不同,因此不会注入serviceMitarbeiter字段。忘记JSF托管的bean并在JSF中使用Spring组件。

还用Spring @Scope替换javax.faces.bean sope注释。

例如@RequestScoped - >@Scope("request")

+0

嗨,我应该用什么来代替@ManagedProperty?因为@Autowire也失败了。 With NullPointerException –

+0

我又一次我发现了错误,当我将JSF集成到我的web.xml中时,我删除了对servlet-context.xml的引用,其中一切都如上所示定义,我再次添加它,现在一切正常:)谢谢没有你我不会看到它 –

+0

你究竟在做什么是通过EL'#{ServiceMitarbeiter}'将Spring bean连接到JSF bean中。你在'faces-config.xml'中做的更多。为什么不通过相同的EL将bean放入JSF中并放置两个容器中的一个。您现在拥有比应用程序代码更多的配置。您也可以使用'@ ManagedProperty'而不是xml配置。这是我见过的最奇怪的配置。我建议检讨一下。 –