【发布时间】:2018-06-13 18:29:03
【问题描述】:
Jasper 报告 6.5.1。在 Studio 中,我可以运行一个 textExpression 为“TODAY()”的报告。但是,在我的 Web 服务器应用程序中,嵌入了 jasperreports jar,我收到此错误:
error: cannot find symbol\r\n value = TODAY( );
我导入了 DateTimeFunctions,并且该函数位于 java 类路径中,但我猜不是编译器。这就是我的代码,试图静态导入所需的函数:
def c = new DateTimeFunctions()
def x = c.TODAY()
JRXmlLoader loader = new JRXmlLoader(new SimpleJasperReportsContext(), new Digester())
JasperDesign designFile = loader.load(sourceFilePath)
// Ensure that custom functions are available when compiling reports.
designFile.addImport("static net.sf.jasperreports.functions.standard.TextFunctions.*")
designFile.addImport("static net.sf.jasperreports.functions.standard.MathFunctions.*")
designFile.addImport("static net.sf.jasperreports.functions.standard.LogicalFunctions.*")
designFile.addImport("static net.sf.jasperreports.functions.standard.DateTimeFunctions.*")
JasperReport jasperReport = JasperCompileManager.compileReport(designFile)
我可以编译其他 jrxml 文件,但其中包含 TODAY() 的文件会引发异常。我怀疑所有静态导入都是这种情况,但我什至无法超越 TODAY() 问题。请注意,日期时间 jar 在 java 类路径中,因为我可以调用 TODAY() 作为测试。
源文件是 groovy;不确定这是否与静态导入混淆,或者问题是什么。有什么帮助吗?
感谢 Alex K 的回复,确认不应该发生任何神秘事件。我认为我不需要 groovy-all,因为我不是在 groovy 中编写脚本,只是源文件在 groovy 中。我查看了为 JasperCompileManager 生成的 java 代码并查看
import static net.sf.jasperreports.functions.standard.DateTimeFunctions.*;
在我看到的 evaluate() 方法中
case 9 :
{
value = TODAY( ); //$JR_EXPR_ID=9$
break;
}
但是,仍然找不到 TODAY() 方法。我会将 groovy 文件重写为 java 文件,以查看 groovy 是否搞砸了。例如,所有大写的方法名称可能是一个问题。或编译器版本 - 在 1.8 下运行。无论如何,抓住稻草,但会努力维持下去。
======================
好的,我创建了一个 java 测试文件来看看为什么我无法解析“TODAY()”。在这里,使用从 jrxml 文件的 java 代码中生成的静态导入:
import java.util.Date;
import static net.sf.jasperreports.functions.standard.DateTimeFunctions.*;
class Test {
Date dtest() {
return TODAY();
}
public static void main(String[] args) {
Test t = new Test();
Date d = t.dtest();
System.out.println(d);
}
}
编译它给出:
javac -cp ./jasperreports-6.5.1.jar;./jasperreports-functions-6.5.1.jar Test.java
Test.java:6: error: cannot find symbol
return TODAY();
^
symbol: method TODAY()
location: class Test
1 error
好吧,我的 Java 技能不是最好的,所以我在这里缺少什么?我正在使用 java 版本“1.8.0_171”进行编译。
我可以完成这项工作的唯一方法是将静态导入的方法声明为“公共静态”。也就是说,
public static Date TODAY() { ...
但这不是 DateTimeFunctions.java 源代码中的内容。
===========================
所以,如果我在这里阅读 6.6.0 文档:http://jasperreports.sourceforge.net/sample.reference/functions/index.html,示例 DateTimeFunctions 都被声明为静态,在我看来这是正确的。那么,我是否为 6.5.1 和 6.6.0 下载了伪造的函数 jar,而“真实”的 jar 是否还有待发现?
【问题讨论】:
-
你把我弄糊涂了 :) 你有 jrxml 或 groovy 代码的问题吗?
For instance, maybe the method name in all caps is a problem- 大写的方法名称。你用的是什么版本的JR?你的情况不清楚 -
jrxml 没有问题,它在 Studio 和 Reports Server 中运行良好,但是当我将 jar 嵌入到 groovy 文件(Grails 插件)中时失败。它无法解析 TODAY 函数。然而,导入存在于 java 类路径中。不,我不相信这是因为方法名称都是大写的。
标签: groovy compilation jasper-reports