【发布时间】:2016-04-27 18:47:27
【问题描述】:
当我尝试使用 jasperreports 6.2.1 库编译在 jasper studio v6.2.0 中创建的 jrxml 文件时,出现以下错误:
net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
/home/david_clymer/Development/VistaShare/OutcomeTracker/HUD329902_1461778704578_563528.java:477: error: cannot find symbol
value = CONCATENATE(((java.lang.String)field_ns058Agency_Physical_City.getValue()),",",((java.lang.String)field_ns058Agency_Physical_State.getValue())," ",((java.lang.String)field_ns058Agency_Ph
ysical_Zip.getValue())); //$JR_EXPR_ID=40$
^
symbol: method CONCATENATE(String,String,String,String,String)
location: class HUD329902_1461778704578_563528
...
9 errors
.
at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:215)
at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:357)
at net.sf.jasperreports.engine.JasperCompileManager.compileToFile(JasperCompileManager.java:273)
at net.sf.jasperreports.engine.JasperCompileManager.compileToFile(JasperCompileManager.java:232)
at net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile(JasperCompileManager.java:542)
at RunReport.compileReport(RunReport.java:80)
at RunReport.main(RunReport.java:192)
如何确保这些函数已导入且可用?
这是我目前所做的调试:
根据我的谷歌搜索,这是由于 java 类路径中缺少 jasperreports-functions-6.2.1.jar 造成的。但是,在我的情况下,它绝对是 在类路径中,并且测试表明它的类是可访问的,但方法不是:
// Imports without error
import net.sf.jasperreports.functions.standard.TextFunctions;
public class Foo {
public static void main(String[] args) {
// Cannot resolve symbol INTEGER_VALUE
Object foo = TextFunctions.INTEGER_VALUE;
}
}
反编译相关类,发现方法确实存在:
david_clymer@zapazoid:~/Development/VistaShare/OutcomeTracker/jasperreports/lib/tmp$ jar -xf ../jasperreports-functions-6.2.1.jar
david_clymer@zapazoid:~/Development/VistaShare/OutcomeTracker/jasperreports/lib/tmp$ java -jar ../../../procyon-decompiler-0.5.30.jar net/sf/jasperreports/functions/standard/TextFunctions.class |grep -A 7 INTEGER_VALUE
@Function("INTEGER_VALUE")
@FunctionParameters({ @FunctionParameter("textNumber") })
public static Integer INTEGER_VALUE(final String textNumber) {
if (textNumber == null) {
logNullTextString();
return null;
}
return Integer.parseInt(textNumber);
}
david_clymer@zapazoid:~/Development/VistaShare/OutcomeTracker/jasperreports/lib/tmp$ grep TextFunctions jasperreports_extension.properties
net.sf.jasperreports.extension.functions.text=net.sf.jasperreports.functions.standard.TextFunctions
我不是真正的 Java 程序员,所以也许我在做一些愚蠢的事情。我只是不知道如何正确引用这些方法,以便我可以确定它们应该工作。
更新:使用静态导入:
import static net.sf.jasperreports.functions.standard.TextFunctions.*
允许将这些函数导入当前命名空间。
所以,回到原来的问题。如果在jasperreports.properties 中设置net.sf.jasperreports.compiler.keep.java.file=true 并尝试编译报告,我可以检查jasper 从jrxml 生成的java 文件。我发现这个文件似乎没有导入必要的功能(INTEGER_VALUE、CONCATENATE 等)。它包含的唯一导入是:
/*
* Generated by JasperReports - 4/27/16 2:27 PM
*/
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.fill.*;
import net.sf.jasperreports.functions.standard.TextFunctions.*;
import java.util.*;
import java.math.*;
import java.text.*;
import java.io.*;
import java.net.*;
【问题讨论】:
-
CONCATENATE 你在哪里找到这个函数/方法的?是你的吗?
-
@PetterFriberg:这是 JasperSoft 提供的 jasperreport-functions-6.2.1.jar 中的一个函数。具体在
net.sf.jasperreports.functions.standard.TextFunctions
标签: java jasper-reports