1

iReportを使用したデザインレポートがあります。このレポートには、年と月を入力として受け取り、その月の最大日数を返すカスタム関数が1つあります。

このメソッドは、java.util.Calendar APIを内部的に使用して、指定された月と年の最大日数を取得します。

このレポートはiReportで正常に機能しますが、このレポートをJasperReports Serverにインポートするとすぐに、この例外が発生します。

Error Message

java.lang.IllegalStateException: Processor of type com.jaspersoft.jasperserver.war.cascade.handlers.converters.DataConverter for class 

java.util.GregorianCalendar not configured

JasperReports Serverでこの問題を解決するにはどうすればよいですか?JasperReports Serverでこのクラスを設定するにはどうすればよいですか?

4

1 に答える 1

1

上記の問題を調査した後、私自身がなんとか解決しました。JasperServerのデータコンバーターの構成を調べましたが、Calendarクラスで使用できるそのようなデータコンバーターはありません。

私が見つけた最善の方法は、Java Calendarクラスで実行するロジック全体を記述し、それをjarにパッケージ化するカスタムクラスを作成することです。次に、そのjarAPIを直接使用して目的を解決します。

私の場合、レポート期間(レポートを生成している期間)を計算したいと思いました。私にとって、この結果の入力は、レポートを生成している月と年でした。以下は私が書いたコードスニペットです

public static String calculateReportingPeriod(String year, String month,
            String dateFormat) {
        String reportingPeriod = new String();
        Calendar calendar = Calendar.getInstance();
        if (year == null || year.isEmpty()) {
            Integer lyear = Calendar.getInstance().get(Calendar.YEAR);
            year = lyear.toString();
        }
        if (month == null || month.isEmpty()) {
            Integer lmonth = Calendar.getInstance().get(Calendar.MONTH);
            /**
             * -1 because report in generate for previous month
             */
            lmonth = lmonth - 1;
            month = lmonth.toString();
        } else {
            Integer lmonth = Integer.parseInt(month);
            lmonth = lmonth - 1;
            month = lmonth.toString();
        }
        if (dateFormat == null || dateFormat.isEmpty()) {
            dateFormat = DATE_FORMAT;
        }
        /**
         * calculating max days in the given month and given year
         */
        calendar.set(Calendar.YEAR, Integer.parseInt(year));
        calendar.set(Calendar.MONTH, Integer.parseInt(month));
        Integer maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

        calendar.set(Integer.parseInt(year), Integer.parseInt(month),
                START_DATE);
        Date reportingStartDt = calendar.getTime();
        reportingPeriod = new SimpleDateFormat(dateFormat)
                .format(reportingStartDt);
        reportingPeriod = reportingPeriod.concat(EMPTY_STRING);
        reportingPeriod = reportingPeriod.concat(DASH_SEPERATOR);
        reportingPeriod = reportingPeriod.concat(EMPTY_STRING);
        calendar.set(Calendar.DATE, maxDays);
        Date reportingEndDt = calendar.getTime();
        reportingPeriod = reportingPeriod.concat(new SimpleDateFormat(
                dateFormat).format(reportingEndDt));
        return reportingPeriod;
    }

次に、iReportsとJasperServerの両方でこのjarを使用して、入力から目的の結果を取得しました。

于 2012-08-14T03:31:45.940 に答える