Изменение параметров отчета Jasper во время выполнения - PullRequest
0 голосов
/ 23 мая 2019

Я знаю, но нам это действительно нужно.У нас четкое разделение труда.Они создают шаблоны, я заполняю их во время выполнения в соответствии с некоторыми правилами.

  • Не могу научить мой бизнес вставлять что-то вроде этого и быть уверенным, что они действительно все сделали нормально (поэтому не могут переместить любую логикув шаблоны):

$ P {risk_types} .get ($ F {risk_type})?: "UNDEFINED"

  • Также не можетзаполнять из файлов, жестко запрограммированных в каком-либо адаптере, написанном богом знает кто и неизменным во время выполнения.Это веб-приложение.Лучший вариант - найти способ заменить этот источник файла из адаптера на ByteArrayStream.

SO: необходимо заменить содержимое параметров (в том числе по умолчанию) во время выполнения.пример: нужно установить JSON_INPUT_STREAM

Как этот нерешенный поток.https://community.jaspersoft.com/questions/516611/changing-parameter-scriptlet Действительно надеюсь не работать на уровне xml, но xml также не может решить мою проблему, насколько я пытался.Спасибо!

1 Ответ

0 голосов
/ 20 июня 2019

Самый простой и чистый способ, которым мы это сделали (исключая использование тонны устаревшей документации и незавершенных недокументированных статических антипаттерновых новых функций):

Создать контекст с расширением репозитория

SimpleJasperReportsContext jasperReportsContext = new SimpleJasperReportsContext();
jasperReportsContext.setExtensions(RepositoryService.class, Collections.singletonList(new MyRepositoryService(jasperReportsContext, yourOptionalParams)));

Заполнить таким образом (после компиляции и других обычных действий)

JasperPrint print = JasperFillManager.getInstance(jasperReportsContext).fill(compiled, new HashMap<>());

Теперь ваш репозиторий должен расширять хранилище по умолчанию, чтобы его можно было внедрить взломом (причина того, что Ходжи закодировал "isAssignableFrom") успешно

public class PrintFormsRepositoryService extends DefaultRepositoryService {

    @Override
    public InputStream getInputStream(RepositoryContext context, String uri) {
        // return here your own good simple poj inputStream even from memory if you found source
        // or pass to another repository service(default one probably)
        return null;
    }

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