我正在开发一个Java Swing应用程序,其中可以生成包含一些可变数据的报告和包含测量值的子报告。
第一次调用操作时,报告按预期生成并在JasperViewer中正确显示。但是如果第二次调用相同的动作,则只显示静态数据。没有其他任何东西生成。
以下代码显示了生成报告的操作:
@Override
public void actionPerformed(ActionEvent e)
{
try
{
InputStream jasperStream = this.getClass().getClassLoader().getResourceAsStream(jasperReport);
MeasurementSubReport measurementReport = new MeasurementSubReport(
reportService.loadReportColumns(),
reportService.loadMeasuredValues(),
reportService.loadStatisticValues());
JasperReport subreport = JasperCompileManager.compileReport(measurementReport.createSubReport());
Map<String, Object> hm = new HashMap<>();
hm.put("MEASURE_DATASOURCE", new JREmptyDataSource());
hm.put("MEASURE_SUBREPORT", subreport);
hm.put(JRParameter.REPORT_LOCALE, Locale.getDefault());
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperStream, hm, reportDataBean);
JasperViewer viewer = new JasperViewer(jasperPrint, false);
viewer.setTitle(BUNDLE.getString("JasperReportAction.viewer.title"));
viewer.setVisible(true);
}
catch (Exception ex)
{
ErrorDialog.showError(BUNDLE.getString("JasperReportAction.error.txt"), ex);
}
}
似乎JasperReports缓存了一些生成的代码。它是否正确?我该如何阻止缓存?
答案 0 :(得分:1)
我有类似的代码,没有缓存问题,现在我猜一些,因为reportDataBean
在代码中不可见。
我猜你的reportDataBean
是JRDatasource
,如果它是JRRewindableDataSource你需要倒回moveFirst()
,因为它会在你执行报告后结束第一次。
如果不是JRRewindableDataSource
,则需要重新创建它。