我们的一个软件实用程序使用实现net.sf.jasperreports.engine.util.FileResolver
的类来加载位于相对于报表的路径或将通过专有文件服务器协议加载的报表元素(例如图像)。从最新版本6.6.0开始,我看到该计划是完全删除FileResolver类。但是,在Javadocs中,它只会注意到该类将被删除。没有指定有关替换的详细信息。
我不希望能够将FileResolver换成另一个具有1:1替换的类,但是我真的想知道报告填充程序现在用于查找外部报表元素的内容。
答案 0 :(得分:2)
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
s(如FileRepositoryPersistenceServiceFactory中所述)。
如果您需要做的是关于相对于报告的资源路径,您还可以查看带有JasperReportSource
参数的JRFiller methods。传递此类对象意味着相对于报表自动解析报表资源引用(前提是存储库服务基于RepositoryContext
实现资源查找)。