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 并注册PersistenceServices(如FileRepositoryPersistenceServiceFactory)。
如果您需要做的是关于相对于报告的资源路径,您还可以查看带有JasperReportSource 参数的JRFiller methods。传递这样一个对象意味着自动将报表资源引用解析为相对于报表的引用(前提是存储库服务实现了基于RepositoryContext 的资源查找)。