JasperReports& Struts2:自定义图表主题

时间:2013-11-25 15:54:15

标签: java struts2 jasper-reports jasper-plugin

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

为此,我在 struts2.xml 中添加了action方法和图像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 文件。 / p>

我已经在我的WEB-INF / lib中添加了 jasperreports-chart-themes jar,我尝试过版本4.0.0和5.1.0但是我总是得到同样的错误。< / p>

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

在使用自定义图表主题之前,有人可以告诉我是否遗漏了某些事情吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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