0

我有一些类在他们的 getter 中使用 CDI 注入的 bean,例如:

class MyBean() {
    @Inject
    private TranslationBean translationBean;

    private String chosenValue;

    public void setChosenValue(String c) { chosenValue = c;}
    public String getChosenValue() {
        return translationBean.getTranslatedValue(chosenValue);
    }
}

底层chosenValue从数据库中加载并保存到数据库中。

现在我想创建一个 JasperReport 生成的 PDF,其中包含DataSource. 我打电话:

JasperFillManager.fillReport("myFile.jasper", new HashMap<String, Object>(), new JRBeanCollectionDataSource(Arrays.asList(myBean));

显然,来自 Weld 的错误消息最终将是没有上下文处于活动状态。

我现在看到两种可能性:

  1. 为 JasperReports创建一个包装类MyBean,其中所有需要的字段都填充了实际数据,并且不需要 CDI 依赖项。问题将是:大量的代码带有大量的样板和重复代码。
  2. 不知何故,设法围绕调用包装一个上下文,JasperFillManager以便它在一个/当前活动的 CDI 上下文中运行。

第二种选择可行吗?还有比提议的方法之一更好的方法吗?

4

1 回答 1

0

如果可以包装所有 JasperStuff,您可能正在考虑创建一个新范围。查看https://github.com/seam/reports中的 Seam Reports 内容,它可能会有所帮助或启发。

于 2013-01-26T15:12:35.190 回答