1

我正在尝试将JasperReports集成到在Struts2上运行的 Web 应用程序中。
我正在使用struts2-jasperreports-plugin (2.3.15)

为此,我在我的struts2.xml中添加了操作方法和图像 servlet 的映射,并且我编写了一个操作,它只需输入一个jrxml源文件并编译报告。

这是我在struts2.xml中添加的配置行

<package name="jasperreport" namespace="/jasperreports" extends="jasperreports-default">
    <action name="getJasperReport" class="....JasperReportAction" method="getJasperReport">
      <result name="success" type="jasper" >
        <param name="location">jasper/tmp/${outFile}</param>
        <param name="format">${format}</param>
        <param name="imageServletUrl">/servlets/image?image=</param>
      </result>
    </action>
</package>

<constant name="struts.action.excludePattern" value="/servlets/image*" />

并在我的web.xml中添加了 servlet 图像的映射:

<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>net.sf.jasperreports.j2ee.servlets.ImageServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/servlets/image</url-pattern>
</servlet-mapping>

此处报告操作方法:

public class JasperReportAction  extends ActionSupport {

    private java.sql.Connection sqlConnection;
    private String sourceFile;
    private String outFile;
    private String format;
    private String reportName;
    private String outputName;


    public JasperReportAction() {
        //initialize the connection...
    }

    //getters and setters..


    public String getJasperReport() {   
        try {
            String reportPath = "jasper/" + reportName;
            JasperCompileManager.compileReportToFile(reportPath,"jasper/tmp/" + outputName + ".jasper");
        }
        catch(Exception e) {
            logger.log("getJasperReport", e);
            return ERROR;
        }

        return SUCCESS;
    }
}

我用一个 JQuery 加载来调用这个动作:

$("#jasperReport").load("url/getJasperReport.action",
    {
        "sourceFile": "source.jrxml", 
        "outFile"   : "outFile", 
        "format"    : "HTML",           
 });

我正在使用iReports 5.1.0编辑我的报告,如果我创建一个图表使用默认主题之一的报告,则该报告已正确编译并显示在我的 Web 应用程序中。

我尝试使用自定义模板,创建它并使用iReport导出 jar ,最后将主题 jar 放在我的 WEB-INF/lib 文件夹下。

当我尝试从我的应用程序中检索报告时,Struts调度程序给了我以下错误:

org.apache.struts2.dispatcher.Dispatcher - 处理请求期间发生异常:null java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ......

即使我尝试打开不使用自定义主题的报告,我也会收到此错误。除非我删除主题 jar。

在报告编译期间似乎没有抛出JasperReports异常,因为 catch 块中的记录器没有记录任何内容,但是没有创建jasper文件。

我已经将jasperreports-chart-themes jar放入我的 WEB-INF/lib 中,我已经尝试了 4.0.0 和 5.1.0 版本,但我总是遇到同样的错误。

当我在iReport中显示报告预览时,一切正常。

有人可以告诉我在使用自定义图表主题之前是否缺少一些事情要做吗?

4

1 回答 1

0

最后我发现了问题所在。
这不是系统的,但有时我有一个ClassNotFoundException而不是InvocationTargetException

我只需要在我的 webapp lib文件夹中添加一些 jar。我需要的是:

  • 自定义主题 jar(显然)
  • jasperreports-chart-themes-5.1.0.jar(而不是 4.0.0)
  • castor-1.2.jar

有较新版本的 castor 库,但其他一些库(可能是 jasperreports-chart-themes?)与 1.2 之后的版本不兼容。似乎在包 org.exolab.castor.core.exceptions 中搜索了 CastorException 类新版本中已移至包org.exolab.castor.xml

于 2013-11-26T15:43:57.743 回答