JasperReports中的Groovy表达式:使用Java';比较中的枚举

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

如果其中一个是Enum,是否可以在报表中使用Groovy语法比较两个Java对象

现在,我的报告在执行过程中失败,原因是:groovy.lang.MissingPropertyException:没有这样的属性:RequestServiceState

表达方式:

($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文件):

注释

  • 不要忘记将所有类添加到类路径
  • 不要忘记在jrxml文件中添加导入(或使用类的全名)
  • 不要忘记让JavaBean的字段对jvm可见。请参阅有关使用的详细信息

  • 您应该发布表达式
    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);
    }