jasperreports无法使用datetime函数进行编译 - 找不到符号

时间:2018-06-13 18:29:03

标签: groovy compilation jasper-reports

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,并且是尚未被发现的“真正的”?

1 个答案:

答案 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>

生成的结果将是:

PDF output