1

レポートを作成するオブジェクトのリストがあります。オブジェクトの属性の 1 つは JodaTime LocalDate オブジェクトです。この日付をレポートに含めたいので、次のようにします。

.addColumn("Shipout", "shipout", LocalDate.class.getName(),50)

次のエラーが発生します。

net.sf.jasperreports.engine.design.JRValidationException: Report design not valid : 
    1. Class "org.joda.time.LocalDate" not supported for text field expression.

それは問題ありませんが、LocalDate 列の型を追加できる何らかの方法が必要です。ドキュメントでこのようなものを見つけることができませんでした。

私が見つけることができる最も近いものは CustomExpression ですが、すべての例は複合列のようなことを指しています。

それを行う正しい方法は何ですか?

ありがとう!

4

3 に答える 3

1

JasperReportsバージョン3.7.1(DynamicJasperバージョン3.1.9でサポート)は、テキストフィールドの式に対して次のクラスのみをサポートします。

  • java.lang.Boolean
  • java.lang.Byte
  • java.util.Date
  • java.sql.Timestamp
  • java.sql.Time
  • java.lang.Double
  • java.lang.Float
  • java.lang.Integer
  • java.lang.Long
  • java.lang.Short
  • java.math.BigDecimal
  • java.lang.Number
  • java.lang.String

この事実は、 net.sf.jasperreports.engine.design.JRVerifierクラスからこのメソッドのソースコードを見て確認できます。

private static synchronized String[] getTextFieldClassNames()
{
    if (textFieldClassNames == null)
    {
        textFieldClassNames = new String[]
        {
            java.lang.Boolean.class.getName(),
            java.lang.Byte.class.getName(),
            java.util.Date.class.getName(),
            java.sql.Timestamp.class.getName(),
            java.sql.Time.class.getName(),
            java.lang.Double.class.getName(),
            java.lang.Float.class.getName(),
            java.lang.Integer.class.getName(),
            java.lang.Long.class.getName(),
            java.lang.Short.class.getName(),
            java.math.BigDecimal.class.getName(),
            java.lang.Number.class.getName(),
            java.lang.String.class.getName()
        };

        Arrays.sort(textFieldClassNames);
    }

    return textFieldClassNames;
}

private void verifyTextField(JRTextField textField)
{
    verifyReportElement(textField);
    verifyFont(textField);
    verifyAnchor(textField);
    verifyHyperlink(textField);

    if (textField != null)
    {
        JRExpression expression = textField.getExpression();

        if (expression != null)
        {
            try
            {
                String className = expression.getValueClassName();
                if (className == null)
                {
                    addBrokenRule("Class not set for text field expression.", expression);
                }
                else if (Arrays.binarySearch(getTextFieldClassNames(), className) < 0)
                {
                    addBrokenRule("Class \"" + className + "\" not supported for text field expression.", expression);
                }
            }
            catch (JRRuntimeException e)
            {
                addBrokenRule(e, expression);
            }
        }
    }
}

ご覧のとおり、verifyTextFieldこのメソッドはこのメッセージを生成します。

フルスタックトレース:

  1. クラス"org.joda.time.LocalDate"は、テキストフィールド式ではサポートされていません。net.sf.jasperreports.engine.design.JRValidationException:レポートデザインが無効です:
  2. クラス"org.joda.time.LocalDate"は、テキストフィールド式ではサポートされていません。net.sf.jasperreports.engine.design.JRAbstractCompiler.verifyDesign(JRAbstractCompiler.java:258)at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:140)at net.sf.jasperreports.engine .JasperCompileManager.compileReport(JasperCompileManager.java:215)at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperReport(DynamicJasperHelper.java:542)at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperReport(DynamicJasperHelper。 :518)ar.com.fdvs.dj.core.DynamicJasperHelper.generateJRXML(DynamicJasperHelper.java:403)

スクリプトレットを使ってみるべきだと思います。これがサンプルです。

于 2011-11-07T14:29:59.570 に答える
0

DJはJRが提供しないものをサポートすることはできません。ただし、CustomEpressionまたはValueFormatterを作成し、必要に応じてデータを変換できます。必要なのは数行だけです。型はサポートされていないため、その型をオブジェクトとして宣言してから、カスタム式または値フォーマッターでダウンキャストし、必要に応じて操作します

http://dynamicjasper.com/2010/10/06/how-to-create-value-formatter/を参照してください

于 2012-02-04T22:06:19.860 に答える