0

それらの1つがEnumの場合、レポート内でGroovy構文を使用して2つのJavaオブジェクトを比較することは可能ですか?

現在、実行中にレポートが失敗しますmore Caused by: groovy.lang.MissingPropertyException: No such property: 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);
        }  
    }
}

すべてのインポートが行われます。

4

1 に答える 1

0

式で列挙型を使用できます。

私はtim_yatesに同意します - RequestStateのjrxmlファイルにインポートを追加するのを忘れたと思います。これが、この例外をキャッチする理由です。

別の問題がsanBezによって言及されました-正しい方法でBeanを使用する必要があります。以下の詳細を参照してください。

enum の使用例。

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="test_enum" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="5950245d-5a85-43a8-a4f6-9e11b44e62d1">
    <import value="packagename.*"/>
    <parameter name="service" class="RequestBean" isForPrompting="false"/>
    <title>
        <band height="79" splitType="Stretch">
            <textField>
                <reportElement uuid="b5084124-1a2c-4bb9-ad93-503aa8474c12" x="122" y="28" width="336" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[($P{service}.state.id == RequestState.Offer.id ? "true" : "false")]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

RequestState 列挙コードは次のとおりです。

package packagename;

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 IllegalStateException {
        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 IllegalStateException();
        }
    }
}

Beans クラスはこちらです。RequestBeanクラス:

package packagename;

public class RequestBean {

    private StateBean state;

    public RequestBean(StateBean state) {
        this.state = state;
    }

    public StateBean getState() {
        return state;
    }
}

StateBeanクラス:

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);
}

結果は次のようになります (生成されたpdfファイル):

ここに画像の説明を入力

:

  1. すべてのクラスをクラスパスに追加することを忘れないでください
  2. jrxmlファイルにインポートを追加することを忘れないでください(またはクラスのフルネームを使用してください)
  3. Java Beanのフィールドをjvmで見えるようにすることを忘れないでください。JavaBean データ ソースの使用に関する詳細を参照してください。
于 2013-09-30T21:07:39.560 に答える