Jasper Reports - фабрика нестандартного формата не использует определенные классы форматирования - PullRequest
2 голосов
/ 18 июля 2011

Я работаю с Jasper Reports, версия 3.7.5.

Я пытаюсь использовать пользовательскую реализацию FormatFactoy для обработки случая пустого строкового представления ("") данных XML дляполе даты.Я реализовал класс, реализующий FormatFactory, который должен это обрабатывать.

public class InvoicePrintFormatFactory implements FormatFactory {

    @Override
    public DateFormat createDateFormat(String string, Locale locale, TimeZone tz) {
        DateFormat format = new SimpleDateFormat(string, locale){

            @Override
            public Date parse(String source) throws ParseException {
                if((source == null) || (source.equals("")))
                    return null;
                return super.parse(source);
            }
        }

        return format;
    }

    @Override
    public NumberFormat createNumberFormat(String string, Locale locale) {

        NumberFormat format = new DecimalFormat(string){

            @Override
            public Number parse(String source) throws ParseException {
                if((source == null) || (source.equals("")))
                    return null;
                return super.parse(source);
            }
        }

        return format;
    }
}

В моем JRXMLDatsource я установил шаблоны исходного формата следующим образом:

JRXmlDataSource reportSource = new JRXmlDataSource(document, headRecordPath);
reportSource.setDatePattern("mm.dd.yy");
reportSource.setNumberPattern("####0.00");

и, конечно, передавал экземплярмоего FormatFactory

reportParams.put(JRParameter.REPORT_FORMAT_FACTORY, new InvoicePrintFormatFactory());

Здесь все работает нормально, если XML источника данных не содержит "" значений для поля даты.Но если это происходит, я получаю следующее исключение:

org.apache.commons.beanutils.ConversionException: Unparseable date: ""
        at org.apache.commons.beanutils.locale.BaseLocaleConverter.convert(BaseLocaleConverter.java:241)
        at org.apache.commons.beanutils.locale.LocaleConvertUtilsBean.convert(LocaleConvertUtilsBean.java:285)
        at net.sf.jasperreports.engine.data.JRAbstractTextDataSource.convertStringValue(JRAbstractTextDataSource.java:69)
        at net.sf.jasperreports.engine.data.JRXmlDataSource.getFieldValue(JRXmlDataSource.java:313)
        at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:821)
        at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:785)
        at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1482)
        at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:126)
        at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946)
        at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:864)
        at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84)
        at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)
        at com.lmobile.crm.invoicePrinter.operator.Printer.operate(Printer.java:219)
        at com.lmobile.crm.invoicePrinter.service.InvoicePrintService.CreatePrintOrder(InvoicePrintService.java:39)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at za.co.softco.rest.ReflectionService.handle(ReflectionService.java:253)
        at za.co.softco.rest.ReflectionHandler.handle(ReflectionHandler.java:94)
        at za.co.softco.rest.RestWorker.handlePost(RestWorker.java:477)
        at za.co.softco.rest.RestWorker.handleClient(RestWorker.java:289)
        at za.co.softco.rest.RestWorker.run(RestWorker.java:152)
        at java.lang.Thread.run(Thread.java:680)
Caused by: java.text.ParseException: Unparseable date: ""
        at java.text.DateFormat.parse(DateFormat.java:337)
        at net.sf.jasperreports.engine.util.JRDateLocaleConverter.parse(JRDateLocaleConverter.java:84)
        at org.apache.commons.beanutils.locale.BaseLocaleConverter.convert(BaseLocaleConverter.java:230)
        ... 23 more

Если я отлаживаю вызовы метода для моей пользовательской реализации FormatFactory, я замечаю, что оба метода не вызываются до запуска в исключение.Поэтому я предполагаю, что Jasper по какой-то причине использует FormatFactory по умолчанию.

Что я здесь не так сделал?У кого-нибудь есть идеи по этому поводу?

Заранее спасибо.

1 Ответ

0 голосов
/ 27 июня 2017

Я нашел учебник, и он работал для меня, в основном я вижу некоторые различия между вашим кодом и кодом в учебнике. First .Вместо орудия FormatFactory вы должны расширить DefaultFormatFactory Секунда .Вы не должны передавать класс в качестве параметра, только настраивайте его в пути к классам iReport.Это ссылка опубликовать сообщение в сообществе jasperreports

Ответ опубликовал пользователь thangalin Я скопирую и вставлю ответ на тот случай, если сообщение будет потеряно.

Кажется, работает следующее:

  1. Нажмите «Окно»> «Настройки» >> «Выбор возможностей»> «Проверить разработку» >> Нажмите «ОК»

Далее:

  • Откройте проводник проекта. Щелкните правой кнопкой мыши имя проекта. Выберите Свойства. Выберите путь сборки Java. Перейдите на вкладку Источник. Нажмите Добавить папку. Выберите Создать новую папку. Установите имя папки для: src Нажмите Готово. Выберите src. Нажмите кнопку ОК.Название проекта / сборка Нажмите кнопку ОК. Создайте отчет как обычно (с текстовым полем, в котором используется дата, либо параметр, либо поле),

Затем:

Выберите отчет впанель Outline Откройте панель «Свойства». Задайте для параметра «Класс фабрики формата» значение: com.company.reports.ReportFormatFactory. Затем создайте некоторый исходный код в каталоге «src» в пакете (папке) с именем."com.company.reports".Вставьте следующее в файл с именем «ReportFormatFactory.java», сохраненный в этом каталоге:

import java.text.DateFormat;
import java.util.Locale;
import java.util.TimeZone;

import net.sf.jasperreports.engine.util.DefaultFormatFactory;

/**
 * Delegates creation of date and number formatters to JasperReports' default
 * formatters. This class ensures that dates are formatted consistently across
 * all reports.
 */
public class ReportFormatFactory extends DefaultFormatFactory {
  /**
   * Returns a DateFormat instance that creates dates in YYYY/MM/dd format.
   *
   * @param pattern Unused.
   * @param locale Passed to the DefaultFormatFactory instance.
   * @param timezone Passed to the DefaultFormatFactory instance.
   *
   * @return An object that can format dates.
   */
  @Override
  public DateFormat createDateFormat(
    String pattern, Locale locale, TimeZone timezone ) {
    return super.createDateFormat( "YYYY/MM/dd", locale, timezone );
  }
}

При запуске отчета дату следует отформатировать как ГГГГ / ММ / дд.

Если вы хотите изменить формат (например, на «дд / мм / гггг»), обновите строку формата даты в исходном коде, а затем перезапустите Jaspersoft Studio (загрузчик классов, похоже, не перезагружаетсякласс ReportFormatFactory после модификации).

...