DynamicJasper addColumn到fastreportbuilder,具有不受支持的数据类型

时间:2011-11-06 20:42:41

标签: java reporting jasper-reports dynamic-jasper

我有一个我正在为其构建报告的对象列表。该对象的一个​​属性是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,但是所有的例子都是指像复合列这样的事情。

这样做的正确方法是什么?

谢谢!

3 个答案:

答案 0 :(得分: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 class:

查看此方法的源代码
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. Class&#34; org.joda.time.LocalDate&#34;文本字段表达式不支持。 net.sf.jasperreports.engine.design.JRValidationException:   报告设计无效:
  2.   
  3. Class&#34; org.joda.time.LocalDate&#34;文本字段表达式不支持。在   net.sf.jasperreports.engine.design.JRAbstractCompiler.verifyDesign(JRAbstractCompiler.java:258)   在   net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:140)   在   net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:215)   在   ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperReport(DynamicJasperHelper.java:542)   在   ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperReport(DynamicJasperHelper.java:518)   在   ar.com.fdvs.dj.core.DynamicJasperHelper.generateJRXML(DynamicJasperHelper.java:403)
  4.   

我认为你应该尝试使用scriptlet。这是sample

答案 1 :(得分:1)

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

例如,在Layouter中

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

在实体中:

public String getLocalTypeAsString() {
        String ret = null;
        if (mannschaftsTyp!=null) {
            ret = localType.getShortDescr();
        }
        return ret;
    }

答案 2 :(得分:0)

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

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