首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >jasperreports无法使用日期时间函数进行编译-找不到符号

jasperreports无法使用日期时间函数进行编译-找不到符号
EN

Stack Overflow用户
提问于 2018-06-14 02:29:03
回答 1查看 1.1K关注 0票数 1

Jasperreports 6.5.1。在Studio中,我可以运行一个textExpression为"TODAY()“的报告。在我的web服务器应用程序中,嵌入了jasperreport 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文件,但是其中包含has ()的文件抛出了异常。我怀疑所有的静态导入都是这种情况,但我甚至不能超越can()问题。注意,datetime jar在java类路径中,因为我可以调用jar()作为测试。

源文件是groovy的;不确定这是否会扰乱静态导入,或者问题出在哪里。有什么帮助吗?

感谢Alex K的回复,确认不应该有什么神秘的事情发生。我不认为我需要groovy,因为我不是在groovy中编写脚本,只是源文件在groovy中。我查看了为JasperCompileManager生成的java代码,并看到

import static net.sf.jasperreports.functions.standard.DateTimeFunctions.*;

在evaluate()方法中,我看到

case 9 : 
{
    value = TODAY( ); //$JR_EXPR_ID=9$
    break;
}

但是,仍然找不到the ()方法。我将把groovy文件重写为java文件,看看groovy是否搞砸了。例如,可能全大写的方法名称是一个问题。或编译器版本-在1.8下运行。无论如何,抓住救命稻草,但会努力保持漂浮。

=====================

好的,我创建了一个java测试文件来看看为什么我不能解析“why ()”。如下所示,使用在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都被声明为静态的,这在我看来是正确的。那么,我已经下载了6.5.1和6.6.0的伪函数jars了吗?“真正的”jars还有待发现吗?

EN

回答 1

Stack Overflow用户

发布于 2018-06-14 03:52:33

如果在模板中使用groovy语言,并在类路径中拥有org.codehaus.groovy:groovy-all和net.sf.jasperreport:jasperreports functions库,则不需要添加import。

这个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>

生成的结果将是:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50843943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档