【发布时间】:2013-11-26 08:41:53
【问题描述】:
我正在使用 Grails 1.3.5、SQL Server 2005、iReports 3.7.6、Jasper 插件 1.1.3。在我的 GSP 页面中,我将 jasperReprt 标记为:
<g:jasperReport jasper="report1" format="PDF">
<input type="hidden" name="test_id" id="test_id"/>
<input type="hidden" name="order_no" id="order_no" />
</g:jasperReport>
为了开发,我在 Config.groovy 中指定了
jasper.dir.reports = './reports'
新建和保存新报表时,reports文件夹中会创建两个文件,即report.jrxml和report.jasper。
在 IE 或 Firefox 中单击 PDF 图标时,会引发 500 服务器错误,下面是堆栈跟踪。
[2010-11-27 01:13:14.998] ERROR groovy.grails.web.errors.GrailsExceptionResolver Invalid byte 1 of 1-byte UTF-8 sequence.
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)
at
但是如果我删除report1.jasper,点击PDF图标时不再抛出错误,PDF报告显示正常。
这是正确的做法吗?
-
我的第二个问题是使用子报告。子报表与主报表位于同一文件夹中。但是当从应用程序执行报告时,会抛出以下错误:
[2010-11-27 01:30:27.556] ERROR groovy.grails.web.errors.GrailsExceptionResolver Could not load object from location : ./reports\report1sub_report.jasper net.sf.jasperreports.engine.JRException: Could not load object from location : ./reports\urine_routinepatient_details_sub_report.jasper at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromLocation(JRLoader.java:262) at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateReport(JRFillSubreport.java:301) at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:327)
它没有找到子报告。我该如何解决?
谢谢。 杰伊·钱德兰。
编辑:
我一直在寻找,但仍然找不到合适的解决方案。所以我做了一些试验和错误。我发现,删除report1.jasper 并将jasper.jrxml 留在报告目录中就可以了,就像我之前说的那样。
对于子报告问题:它给出了错误Could not load object from location : ./reports\report1sub_report.jasper 出于某种奇怪的原因,主报告名称report 被附加到名称sub_report.jasper 并正在寻找一个名为report1sub_report.jasper 的文件
所以我在reports 文件夹下创建了一个子文件夹并将其命名为report1 并更新了report1.jrxml 文件
<subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "\\sub_report.jasper"]]></subreportExpression>
我必须添加额外的 \\ 斜杠,即使“SUBREPORT_DIR”参数在路径末尾有 \\ 斜杠,如下所示。
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["F:\\Workspace\\SpringSource2.5.0\\GrailsProjec\\reports\\report1\\"]]></defaultValueExpression>
</parameter>
注意最后的\\。我不知道为什么它没有被附加!
另一种方法是将子报告名称从sub_report.jasper
更改为report1sub_report.jasper!!! :)
我已经在生产模式下测试过它,它工作正常。我不确定这是否是这样做的方法,但所有其他可能的解决方案都不适合我。
反馈会很有帮助。
【问题讨论】:
-
感谢您针对字符编码问题提供的解决方法,我仍在调查它是否是正确的解决方案
-
我已选择将编译后的.jasper的目录更改为c\windows\temp,以避免手动删除文件。
标签: grails grails-plugin jasper-plugin