【问题标题】:JasperReports & Struts2: custom chart themesJasperReports & Struts2:自定义图表主题
【发布时间】:2013-11-25 15:54:14
【问题描述】:

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

为此,我在我的 struts2.xml 中添加了操作方法和图像 servlet 的映射,并且我编写了一个简单地接受输入的操作 jrxml em> 源文件并编译报告。

这是我在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
在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) .......

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

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

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

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

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

【问题讨论】:

  • 你能发布代码和配置的相关部分吗? (动作,web.xml,struts.xml)
  • 我编辑了帖子并添加了一些信息
  • 我不知道为什么会引发异常,但是非常不鼓励运行时编译in the documentation“同样,不要在生产代码中使用它。你应该当然,要么提供已编译的模板,要么进行某种检查以避免在每个请求上编译模板。” 我的 2 美分:尝试调整您的代码,使其与教程中的代码相似,一旦它工作,如果需要,开始定制。
  • 是的,我已经阅读了文档中的建议,但我的目的是允许用户稍后在 webapp 中上传和更改 jrxml 源,所以我需要重新编译。但我会尽量听从你的建议,谢谢:)

标签: java struts2 jasper-reports jasper-plugin


【解决方案1】:

最后我找到了问题所在。
这不是系统的,但有时我有一个 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    相关资源
    最近更新 更多