Одна из наших программных утилит использует класс, реализующий net.sf.jasperreports.engine.util.FileResolver, для загрузки элементов отчета (например, изображений), которые находятся по пути относительно отчета или которые должны быть загружены через собственный протокол файлового сервера. Что касается последней версии, 6.6.0, я вижу, что планируется полностью удалить класс FileResolver. Однако в документации Javadocs только отмечается, что класс будет удален. Подробностей о замене не уточняется.
Я не ожидаю, что смогу обменять FileResolver с другим классом с заменой 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).
Мне пришлось указать полный путь в «/ путь / к / репозиторию». Относительные пути или канонические имена не работали.