Jasperreports 6.5.1。在Studio中,我可以运行textExpression为“TODAY()”的报表。在我的网络服务器应用程序中,嵌入了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()称为测试。
源文件很常见;不确定是否与静态导入混淆,或者问题是什么。有什么帮助吗?
感谢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”。也就是说,
public static Date TODAY() { ...
但这不是DateTimeFunctions.java源代码中的内容。
=========================
所以,如果我在这里阅读6.6.0文档:http://jasperreports.sourceforge.net/sample.reference/functions/index.html,示例DateTimeFunctions都被声明为static,这在我看来是正确的。那么,我是否已经为6.5.1和6.6.0下载了伪造的函数jar,并且是尚未被发现的“真正的”?
答案 0 :(得分:2)
如果在模板上使用 groovy 语言并且使用 org.codehaus.groovy:groovy-all 和 net.sf,则无需添加导入.jasperreports:类路径中的jasperreports-functions 库。
此 jrxml 正常工作:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="TODAY using" whenNoDataType="AllSectionsNoDetail" language="groovy">
<title>
<band height="60">
<textField>
<reportElement x="0" y="30" width="100" height="30"/>
<textFieldExpression><![CDATA[TODAY()]]></textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
依赖关系:
<dependencies>
<!-- some dependencies -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.5.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-functions</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies>
同样适用于默认的 java 语言。
静态导入也适用于 JasperReports 。
使用 Guava 库中的某些方法的示例:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Static import" whenNoDataType="AllSectionsNoDetail">
<import value="static com.google.common.base.Strings.repeat"/>
<title>
<band height="60">
<textField>
<reportElement x="0" y="30" width="200" height="30"/>
<textFieldExpression><![CDATA[repeat("a", 3)]]></textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
生成的结果将是: