JasperReports中的Groovy表达式:使用Java';比较中的枚举
如果其中一个是Enum,是否可以在报表中使用Groovy语法比较两个Java对象 现在,我的报告在执行过程中失败,原因是:groovy.lang.MissingPropertyException:没有这样的属性:RequestServiceState 表达方式:JasperReports中的Groovy表达式:使用Java';比较中的枚举,groovy,jasper-reports,Groovy,Jasper Reports,如果其中一个是Enum,是否可以在报表中使用Groovy语法比较两个Java对象 现在,我的报告在执行过程中失败,原因是:groovy.lang.MissingPropertyException:没有这样的属性:RequestServiceState 表达方式: ($P{service}.state.id == RequestState.Offer.id ? "true" : "false") 其中RequestState为: public enum RequestState { Ne
($P{service}.state.id == RequestState.Offer.id ? "true" : "false")
其中RequestState为:
public enum RequestState {
New(1), InProcess(2), Pending(3), Offer(4), Order(5), Done(6);
private Integer value;
private RequestState(final Integer value) {
this.value = value;
}
public Integer getId() {
return this.value;
}
public static RequestState getValue(final Integer value) throws EnumValueNotFoundException {
switch (value) {
case 1:
return New;
case 2:
return InProcess;
case 3:
return Pending;
case 4:
return Offer;
case 5:
return Order;
case 6:
return Done;
default:
throw new EnumValueNotFoundException(value);
}
}
}
所有导入都已完成。您可以在表达式中使用枚举类型
我同意tim_yates的观点-我认为您忘记了在RequestState的jrxml文件中添加导入,这就是您捕获此异常的原因
sanBez提到了另一个问题-您应该以正确的方式使用Bean。详情见下文
使用枚举的示例。
jrxml文件:
RequestState枚举代码为:
bean类在这里。RequestBean类:
StateBean类:
测试代码为:
public static void testReport(String reportSource, String outputFileName) throws JRException {
Map<String, Object> params = new HashMap<String, Object>();
params.put("service", new RequestBean(new StateBean(4)));
JasperReport jasperReport = JasperCompileManager.compileReport(reportSource);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());
JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName);
}
publicstaticvoidtestreport(stringreportsource,stringoutputfilename)抛出异常{
Map params=新的HashMap();
参数put(“服务”,新的RequestBean(新的StateBean(4));
JasperReport-JasperReport=JasperCompileManager.compileReport(reportSource);
JasperPrint-JasperPrint=JasperFillManager.fillReport(jasperReport,params,new-jreportydatasource());
jaspeexportmanager.exportReportToPdfFile(jasperPrint,outputFileName);
}
结果将是(生成的pdf文件):
注释:
您应该发布表达式
id
-它是原始类型(int?)吗?以及$P{service}
的类型是什么?:)您是否尝试过枚举的完整包名,即:($P{service}.state.id==org.whather.RequestState.Offer.id?“true”:“false”)
1$P{service}必须具有concret类(不是java.lang.Object)2。这个类必须包含getState()方法,AFAIK jasper使用getter处理私有成员,但不能包含变量名。尝试创建getter方法并使用它来代替类的直接成员
package packagename;
public class RequestBean {
private StateBean state;
public RequestBean(StateBean state) {
this.state = state;
}
public StateBean getState() {
return state;
}
}
package packagename;
public class StateBean {
private Integer id;
public StateBean(int id) {
this.id = id;
}
public Integer getId() {
return id;
}
}
public static void testReport(String reportSource, String outputFileName) throws JRException {
Map<String, Object> params = new HashMap<String, Object>();
params.put("service", new RequestBean(new StateBean(4)));
JasperReport jasperReport = JasperCompileManager.compileReport(reportSource);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());
JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName);
}