【问题标题】:What might cause BIRT to lose an object reference between fetch and render?什么可能导致 BIRT 在 fetch 和 render 之间丢失对象引用?
【发布时间】:2014-07-22 14:50:33
【问题描述】:

见文末更新

我有一个脚本数据源。数据集基于包含许多集合的 Java 对象。

我的报告包含一个页眉、正文和页脚,所有这些都有绑定到此数据集的项目。顶级数据集存储对 Java 对象的引用。这被传递给返回各种列表的子数据集。

POJO

public class Protocol {
    String name;
    int id;
    List<Device> devices;
    List<TestResult> results;
    ...
}

DAO

public class DAO {
    public List<Protocol> getProtocols(String filePath) {
        return deserialise(filePath);
    }
}

协议数据集

open:
model = new Packages.com.acme.atf.model.dao.AtfObjects();

path = inputParams["ProtocolPath"];

iterP = model.getProtocols(path).iterator();
countP = 0;

fetch:
if(iterP.hasNext()) {
    var p = iterP.next();
    row["ProductId"] = p.getId();
    row["ProductVersion"] = p.getProductVersion();
    row["ProtocolObject"] = p;
    log("po=" + p);
    return true;
}
return false;

设备数据集

open:
protocol = inputParams["ProtocolObject"];
if(protocol == null) {
    log("Protocol is NULL");
    return;
}
iterD = protocol.getDevices().iterator();

日志输出记录:

po=com.acme.atf.model.Protocol@5a5901
Protocol is NULL

表示对象在添加到结果时不为空,但在传递到第二个数据集时为空。

我还尝试将协议数据集拉入报告中,从而创建一个表格。 ProtocolObject 的值已经为空。 (为了清楚起见,其他属性都填充了合理的值)

什么可能导致row['ProtocolObject'] 变为空?

更新 我基于包含上述脚本的库创建了一个简单的报告。我将协议数据集作为表格拉入,ProtocolObject 的单元格 not 为空!我拉了第二张表,ProtocolObject 的两个单元格都为空。在日志中,我可以看到完成了 2 次获取,并且每次获取了不同的协议实例:

Wed Jul 23 2014 07:28:37 GMT+0200 (CEST)  ===========================================
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST)  Open protocol: testcase.protocol
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST)  exit open P
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST)  po=com.acme.atf.model.Protocol@2892c0
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST)  Protocol: no more records
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST)  ===========================================
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST)  Open protocol: testcase.protocol
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST)  exit open P
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST)  po=com.acme.atf.model.Protocol@13ea352
Wed Jul 23 2014 07:28:37 GMT+0200 (CEST)  Protocol: no more records

【问题讨论】:

  • 如果您从数据集协议创建一个简单的表,并使用表达式进行数据绑定:dataSetRow['ProtocolObject'].getId() 它是否有效或者这个对象已经为空?
  • @Dominique - 已经尝试过了。它是空的。
  • 我在这里没有发现任何问题,但请注意 BIRT 将缓存 DS 结果。这可能会起作用。如果您的外部 DS 协议不能像您对 Dominique 问题的回答所暗示的那样工作,您应该首先尝试列出一个简单的“协议”工作清单。
  • @hvb - 我考虑了这一点,并在 DS 中添加了一个虚拟参数。每个表使用不同的虚拟值来防止缓存。没有变化:-(

标签: birt pojo


【解决方案1】:

我想我找到了原因。

这对某些人来说可能很明显,但原因似乎是Protocol 对象不是完全可序列化的。我发现其中一个包含的类没有实现java.io.Serializable

它可能在文档中的某个地方,但是,如果您想在结果集中包含一个 Java 对象,它必须是完全可序列化的

【讨论】:

  • 我知道(很难),但我认为我可以排除这个原因,因为我在源代码的某处读到了反序列化这个词。我的错……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
相关资源
最近更新 更多