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.字节
  • java.util.日期
  • java.sql.时间戳
  • 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.compileReport(JRAbstractCompiler.java:140) 在 net.sf.jasperreports.engine 的 net.sf.jasperreports.engine.design.JRAbstractCompiler.verifyDesign(JRAbstractCompiler.java:258) .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.java :518) 在 ar.com.fdvs.dj.core.DynamicJasperHelper.generateJRXML(DynamicJasperHelper.java:403)

我认为您应该尝试使用scriptlet。这是示例

于 2011-11-07T14:29:59.570 回答
1

例如,您可以只使用一个函数getLocalDateAsString,并在 POJO 或 ValueObject 中使用 String 的返回值来实现此函数。

例如,在布局器中

drb.addColumn("LocalType", "localTypeAsString", String.class.getName(), 50)

在实体中:

public String getLocalTypeAsString() {
        String ret = null;
        if (mannschaftsTyp!=null) {
            ret = localType.getShortDescr();
        }
        return ret;
    }
于 2012-01-27T15:32:48.320 回答
0

DJ 不能支持 JR 不给的东西。但是您可以创建一个 CustomEpression 或 ValueFormatter 并根据需要转换数据。你只需要几行。因为不支持类型,所以将其类型声明为对象,然后在自定义表达式或值格式化程序中向下转换并根据需要进行操作

http://dynamicjasper.com/2010/10/06/how-to-create-value-formatter/

于 2012-02-04T22:06:19.860 回答