File resolver in Jasper Reports 5.0.1

2019-01-19 06:21发布

问题:

with 5.0.1 the REPORT_FILE_RESOLVER was deprecated and the sample implementations: http://jasperreports.sourceforge.net/sample.reference/tableofcontents/index.html#fileresolver

state that it's highly recommended to switch to JasperReportsContext.

I couldn't find any examples of JasperReportsContext usage. As far as I know I should be looking for LocalJasperReportsContext which has a FileResolver getter and setter.

I'm asking, how does it have to be done?

回答1:

After browsing the sources I found the solution.

The JRXML imageExpression tag:

<band height="79" splitType="Stretch">
<image scaleImage="FillFrame" isLazy="true" onErrorType="Blank">
    <reportElement uuid="3340bf0f-8471-45e9-8ea4-bdf44a7c0e68" x="0" y="0" width="150" height="69"/>
    <imageExpression class="java.io.File"><![CDATA["image.jpg"]]></imageExpression>
</image>

Java code snippet:

FileResolver resolver = new FileResolver() {
@Override
public File resolveFile(String filename) {
    return new File("/some/path");
}
};


InputStream jasperfile = getClass().getClassLoader().getResourceAsStream("file.jasper");

LocalJasperReportsContext ctx = new LocalJasperReportsContext(DefaultJasperReportsContext.getInstance());
ctx.setClassLoader(getClass().getClassLoader());
ctx.setFileResolver(resolver);
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperfile);

JasperFillManager fillmgr = JasperFillManager.getInstance(ctx);
JasperExportManager exmgr = JasperExportManager.getInstance(ctx);

JasperPrint jasperPrint = fillmgr.fill(jasperReport, parameters, beanColDataSource);
ByteArrayOutputStream pdfBytes = new ByteArrayOutputStream();
exmgr.exportToPdfStream(jasperPrint, pdfBytes);

You have to create a new context and pass it to JasperFillManager and JasperExportManager.



回答2:

use extension is other way.

  1. registry a customize ExtensionsRegistryFactory on jasperreports_extension.properties net.sf.jasperreports.extension.registry.factory.repository.th.resource.file.resolve=th.motive.jasper.report.extension.factory.ResourceFileResolveRepositoryExtensionsRegistryFactory

  2. create a ExtensionRegistry call ResourceFileResolveRepositoryExtensionRegistry

  3. on ResourceFileResolveRepositoryExtensionRegistry you can registry your service to handle file resolver

(*) it's not only file resolver, you can do anything that StreamRepositoryService do

you reference full from my sample https://bitbucket.org/idplugin/th.motive.jasperreport.extend