我发现了问题,和我之前解释的没什么关系,我的坏^^!
其实 Avro 中存在一种 bug ... 简而言之,我填充了使用 builder 创建的嵌套 avro 记录并设置了所有字段:
deviceInfoBuilder = MobtabAvroDeviceInfo.newBuilder();
deviceInfoBuilder.setModelName(mobtabJsonHit.getMobtabJsonDeviceInfo().getModuleName());
deviceInfoBuilder.setOperatingSystemName(mobtabJsonHit.getMobtabJsonDeviceInfo().getOperatingSystemName());
deviceInfoBuilder.setOperatingSystemVersion(mobtabJsonHit.getMobtabJsonDeviceInfo().getOperatingSystemVersion());
deviceInfoBuilder.setType(mobtabJsonHit.getMobtabJsonDeviceInfo().getDeviceType());
deviceInfoBuilder.setAdId(mobtabJsonHit.getMobtabJsonDeviceInfo().getDeviceAdId());
当信息不可用时(即嵌套的 Jackson 不存在),我创建了一个“空”的嵌套 Avro 记录并将其提供给构建器,如下所示:
private final static MobtabAvroDeviceInfo emptyMobtabAvroDeviceInfo =
new MobtabAvroDeviceInfo(null, null, null, null, null);
deviceInfoBuilder = MobtabAvroDeviceInfo.newBuilder(emptyMobtabAvroDeviceInfo);
然后,我得到了以下异常:
java.lang.NullPointerException: null of string of fr.mediametrie.internet.pame.meter.avro.MobtabAvroDeviceInfo of fr.mediametrie.internet.pame.meter.avro.MobtabAvroHit
虽然我的 Avro 架构启用了“空”值...
{
"name": "device_info",
"type": {
"type": "record",
"name": "MobtabAvroDeviceInfo",
"fields": [
{
"name": "model_name",
"type": ["null", "string"],
"default": null
},
{
"name": "operating_system_name",
"type": ["null", "string"],
"default": null
},
{
"name": "operating_system_version",
"type": ["null", "string"],
"default": null
},
{
"name": "type",
"type": ["null", "string"],
"default": null
},
{
"name": "ad_id",
"type": ["null", "string"],
"default": null
}
]
}
}
为了解决这个问题,我刚刚创建了一个新的构建器,没有在参数中指定一个“空”的嵌套 Avro 记录:
deviceInfoBuilder = MobtabAvroDeviceInfo.newBuilder();
总而言之,似乎我无法使用默认值创建“空”嵌套 Avro 并向构建器提供,但我必须让构建器使用架构中指定的默认值构建该对象。奇怪,但它现在可以工作了:)