Что заменяет FileResolver в API JasperReports?

Одна из наших программных утилит использует класс, реализующий net.sf.jasperreports.engine.util.FileResolver, для загрузки элементов отчета (например, изображений), которые находятся по пути относительно отчета или которые должны быть загружены через собственный протокол файлового сервера. Что касается последней версии, 6.6.0, я вижу, что планируется полностью удалить класс FileResolver. Однако в документации Javadocs только отмечается, что класс будет удален. Подробностей о замене не уточняется.

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
892
1

Ответы 1

FileResolver устарел в пользу реализаций net.sf.jasperreports.repo.RepositoryService.

Существует встроенная реализация под названием net.sf.jasperreports.repo.FileRepositoryService, которая примерно эквивалентна устаревшей net.sf.jasperreports.engine.util.SimpleFileResolver.

Службы репозитория зарегистрированы как расширения JasperReportsContext.

Это можно сделать либо в файле jasperreports_extension.properties следующим образом:

net.sf.jasperreports.extension.registry.factory.file.repository=net.sf.jasperreports.repo.FileRepositoryServiceExtensionsRegistryFactory
net.sf.jasperreports.extension.file.repository.root=/path/to/repository
net.sf.jasperreports.extension.registry.factory.persistence=net.sf.jasperreports.repo.FileRepositoryExtensionsRegistryFactory

Регистрацию расширений также можно выполнить, программно создав объект JasperReportsContext и затем используя его для заполнения отчетов:

    SimpleJasperReportsContext context = new SimpleJasperReportsContext();
    FileRepositoryService fileRepository = new FileRepositoryService(context, "/path/to/repository", false);
    context.setExtensions(RepositoryService.class, Collections.singletonList(fileRepository));
    context.setExtensions(PersistenceServiceFactory.class, Collections.singletonList(FileRepositoryPersistenceServiceFactory.getInstance()));

    JasperPrint jasperPrint = JasperFillManager.getInstance(context).fill(jasperReport, params);

Если вам нужно реализовать собственный сервис репозитория, вы можете взять FileRepositoryService в качестве ссылки. Вы, вероятно, захотите реализовать StreamRepositoryService и зарегистрировать PersistenceService (как в FileRepositoryPersistenceServiceFactory).

Если вам нужно указать пути к ресурсам относительно отчета, вы также можете взглянуть на Методы JRFiller, который принимает аргумент JasperReportSource. Передача такого объекта предназначена для автоматического разрешения ссылок на ресурсы отчета относительно отчета (при условии, что служба репозитория реализует поиск ресурсов на основе RepositoryContext).

Мне пришлось указать полный путь в «/ путь / к / репозиторию». Относительные пути или канонические имена не работали.

lalo 20.02.2019 20:27

Другие вопросы по теме