1

我对 JSF 真的很陌生,但这是我的问题:

WARNING: #{Generate.viewReportPDF}: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'Generate' resolved to null

我搜索并尝试了很多东西,但没有成功,所以我寻求您的帮助:

这是我在包 com.test 中的 Generate.java :

package com.test;

import javax.faces.context.FacesContext;
import javax.inject.Scope;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.TransformerException;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import javax.faces.bean.ManagedBean;

@ManagedBean
public class Generate {
    ...

    public void viewReportPDF () throws IOException {
     ...   
    }

}

这是我的 web.xml(在 WEB-INF 中)

<?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">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <context-param>
    <param-name>javax.faces.CONFIG_FILES</param-name>
    <param-value>/WEB-INF/faces-config.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/init.jsp</welcome-file>
    </welcome-file-list>
</web-app>

这是我的 faces-config.xml(在 WEB-INF 中):

<managed-bean>
        <managed-bean-name>Generate</managed-bean-name>
        <managed-bean-class>
            com.test.Generate
        </managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

这是我的 init.jsp :

<jsp:root version="1.2" xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:jsp="http://java.sun.com/JSP/Page">
        <jsp:directive.page contentType="text/html;charset=UTF-8"
            pageEncoding="UTF-8" />
        <f:view>
            <html>
            <head>
            <title>Test iReport With JSF</title>
            </head>
            <body style="background-color: #fff4db">
            <h:form id="reportForm" target="report">
                <h:commandButton id="pdfButton" value="Visualiser PDF"
                    styleClass="buttonStyle" action="#{Generate.viewReportPDF}" />

            </h:form>
            </body>
            </html>
        </f:view>
    </jsp:root>

当我运行时出现此错误:

警告:#{Generate.viewReportPDF}:javax.el.PropertyNotFoundException:目标不可达,标识符“生成”解析为空

4

1 回答 1

2

Java 命名约定规定实例变量名称以小写字母开头。您需要使用#{generate.viewReportPDF}而不是#{Generate.viewReportPDF}.

如果您真的坚持使用大写的实例变量名称(这很糟糕),那么您始终可以在@ManagedBean注释中覆盖它:

@ManagedBean(name="Generate")
@SessionScoped
public class Generate {

请注意,我添加了@SessionScoped注释,您忘记了。faces-config.xml您还应该删除那些只会与注释冲突并覆盖它们的多余和老式托管 bean 配置。我还建议使用 Facelets 而不是古老的 JSPX。

于 2012-02-27T19:03:07.407 回答