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还有待发现吗?
发布于 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>
生成的结果将是:
https://stackoverflow.com/questions/50843943
复制相似问题