DynamicJasper addColumn для fastreportbuilder с неподдерживаемым типом данных - PullRequest
1 голос
/ 07 ноября 2011

У меня есть список объектов, для которых я создаю отчет.Одним из атрибутов объекта является объект 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 ]

1 голос
/ 27 января 2012

Вы можете просто использовать функцию, например, getLocalDateAsString и реализовать эту функцию с возвращаемым значением String в POJO или ValueObject.

Например, в Layouter

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

В сущности:

public String getLocalTypeAsString() {
        String ret = null;
        if (mannschaftsTyp!=null) {
            ret = localType.getShortDescr();
        }
        return ret;
    }
1 голос
/ 07 ноября 2011

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. Класс "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) в 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)

Я думаю, вам стоит попробовать скриптлет. Вот образец .

0 голосов
/ 05 февраля 2012

DJ не может поддерживать то, что не дает JR.Но вы можете создать CustomEpression или ValueFormatter и конвертировать данные так, как вам нужно.Вам нужно всего несколько строк.Поскольку тип не поддерживается, объявите его тип как объект, затем в пользовательском выражении или в формататоре значений уменьшите значение и работайте при необходимости

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...