1

我目前正在尝试在后台实现文件导出,以便用户可以在文件下载时执行一些操作。

我使用了 apache isisCommandExexuteIn:Background动作属性。但是,我收到一个错误“不是(可编码的)值”,这是ScalarValueRenderer类引发的错误。

这就是我的方法的样子:

@Action(semantics = SemanticsOf.SAFE,
        command = CommandReification.ENABLED)
        commandExecuteIn =  CommandExecuteIn.BACKGROUND)
public Blob exportViewAsPdf() {
    final Contact contact = this;
    final String filename = this.businessName + " Contact Details";

    final Map<String, Object> parameters = new HashMap<>();
    parameters.put("contact", contact);

    final String template = templateLoader.buildFromTemplate(Contact.class, "ContactViewTemplate", parameters);
    return pdfExporter.exportAsPdf(filename, template);
}

我认为该错误与实际上并未调用操作但返回持久后台命令的命令有关。

这个实现实际上适用于没有返回类型的方法。我错过了什么?或者有没有办法实现后台命令并获得预期的结果?

4

1 回答 1

0

有趣的用例,但是当框架的那部分被实现时,我并没有预料到它,所以我并不惊讶它不起作用。显然,您在这里得到的错误消息非常模糊,所以我提出了一张 JIRA 票,看看我们是否至少可以改进它。

我很想知道您认为该框架应该在这里提供什么样的用户体验?

在我们开发的Estatio应用程序中(在过去几年中,该应用程序已经淘汰了添加到框架中的许多功能),我们有一个类似的要求,即从报告服务器获取 PDF(这需要 5 到 10 秒),然后下载它们。这适用于购物中心的所有租户,因此一次可以生成 5 到 50 个。我们采用的设计是将渲染移动到后台命令中(类似于代码片段中的 templateLoader.buildFromTemplate(...) 和 pdfExporter.exportAsPdf(...) 方法调用,并将输出捕获为 Document ,通过文档模块。然后,我们使用pdfbox 插件将所有文档 PDF 拼接在一起,作为一个可下载的 PDF 进行打印。

希望这能给您一些想法,以不同的方式来支持您的用例

谢谢丹

于 2017-06-16T06:20:03.933 回答