在运行时更改Jasper报告参数

时间:2019-05-23 09:43:34

标签: jasper-reports

我知道,但我们确实需要它。 我们分工明确。 它们创建模板,我根据一些规则在运行时填充它们。

  • 不能教我的公司插入这样的东西,并确保他们确实做得很好(因此不能将任何逻辑移到模板上):
  

$ P {risk_types} .get($ F {risk_type})吗?:“未定义”

  • 也无法从由God-knows-who编写并在运行时不可更改的某些适配器中硬编码的文件填充。这是一个网络应用程序。最好的选择是找到一种方法,将该文件源从适配器替换为ByteArrayStream。

SO: 在运行时需要替换参数的内容(也是默认值)。 例: 需要设置JSON_INPUT_STREAM

就像这个未解决的线程。 https://community.jaspersoft.com/questions/516611/changing-parameter-scriptlet 确实希望不要在xml级别上工作,但是就我所尝试的而言,xml也无法解决我的问题。 谢谢!

1 个答案:

答案 0 :(得分:0)

我们这样做的最简单,最干净的方法(绕过使用大量不推荐使用的文档和未完成的有问题的未文档化静态反模式新功能):

使用存储库扩展名创建上下文

SimpleJasperReportsContext jasperReportsContext = new SimpleJasperReportsContext();
jasperReportsContext.setExtensions(RepositoryService.class, Collections.singletonList(new MyRepositoryService(jasperReportsContext, yourOptionalParams)));

以这种方式填充(在编译和其他常规操作之后)

JasperPrint print = JasperFillManager.getInstance(jasperReportsContext).fill(compiled, new HashMap<>());

现在,您的存储库必须扩展默认存储库才能成功注入(由于hodgie编码为“ isAssignableFrom”)

public class PrintFormsRepositoryService extends DefaultRepositoryService {

    @Override
    public InputStream getInputStream(RepositoryContext context, String uri) {
        // return here your own good simple poj inputStream even from memory if you found source
        // or pass to another repository service(default one probably)
        return null;
    }

}