【问题标题】:'#{customer.all}' Error reading 'all' on type com.corejsf.CustomerBean] with root cause java.lang.NullPointerException'#{customer.all}' 在类型 com.corejsf.CustomerBean] 上读取 'all' 时出错,根本原因是 java.lang.NullPointerException
【发布时间】:2011-09-03 22:22:22
【问题描述】:

我用谷歌搜索但找不到解决方案。它来自 Core JSF 3rd。

我做到了:

1) 在构建路径中包含 JSF Mojarra

2) 在构建路径中包含 MySQL JDBC 驱动程序

3) 复制 MySQL JDBC 驱动程序 到 Tomcat “lib” 文件夹和 “ext” JDK 文件夹。

4) 我用一个小型 Java 应用测试了 JDBC 驱动程序,它成功了。

CustomerBean 来自 corejsf 源代码:

public class CustomerBean {
    @Resource(name="jdbc/corejsf")
    private DataSource source;

    public ResultSet getAll() throws SQLException {
        Connection conn = source.getConnection();
        try {
            Statement stmt = conn.createStatement();
            ResultSet result = stmt.executeQuery("SELECT * FROM Customers");
            // return ResultSupport.toResult(result);
            CachedRowSet crs = new com.sun.rowset.CachedRowSetImpl();
            // or use an implementation from your database vendor
            crs.populate(result);
            return crs;
        } finally {
            conn.close();
        }
    }
}

错误:

SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/DatabaseTest] threw exception [/index.jsp(12,3) '#{customer.all}' Error reading 'all' on type com.corejsf.CustomerBean] with root cause
java.lang.NullPointerException
    at com.corejsf.CustomerBean.getAll(CustomerBean.java:18)
    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 javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
    at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
    at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.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:554)
    at javax.faces.component.UIData.getDataModel(UIData.java:1248)
    at javax.faces.component.UIData.setRowIndex(UIData.java:447)
    at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:823)
    at javax.faces.component.UIData.encodeBegin(UIData.java:937)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1611)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
    at com.sun.faces.application.view.JspViewHandlingStrategy.doRenderView(JspViewHandlingStrategy.java:420)
    at com.sun.faces.application.view.JspViewHandlingStrategy.renderView(JspViewHandlingStrategy.java:209)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
    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:313)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:182)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

【问题讨论】:

  • CustomerBean.java:18 抛出异常。您的商家信息中的哪一行?
  • 连接连接 = source.getConnection();

标签: eclipse jsf tomcat jdbc


【解决方案1】:

您需要在Tomcat中配置一个JNDI datasource,名称为jdbc/corejsf

【讨论】:

    【解决方案2】:

    我怀疑没有注入数据源,因为您的类路径中没有任何内容可以解释 @Resource 注释。据我所知,@Resource 是一个 EJB 注释,但 Tomcat 不是 EJB 容器。尝试以编程方式查找数据源。

    【讨论】:

    • 但它来自本书的源代码(在“tomcat”文件夹中)。我认为这不是原因。
    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 2014-02-03
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2014-11-13
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多