0

我目前挂断了 Spring 和 JSF 集成。我想我错误地配置了一些东西,我看不出到底是什么。我得到一个空指针异常,因为 JSF Bean 不会加载服务层。我的配置如下:

堆栈跟踪

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)

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

面孔-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.auftragssystem.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;
    }
}

我为每一个快速的线索感到高兴:) 因为我不知道了

4

1 回答 1

0

org.springframework.web.jsf.el.SpringBeanFacesELResolver你的类需要是一个简单的 Spring 组件。删除@ManagedBean和添加@Component注释。

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

还要用 Spring 替换javax.faces.beansope 注释@Scope

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

于 2012-09-05T17:28:59.713 回答