簡體   English   中英

java.io.IOException:org.apache.thrift.protocol.TProtocolException:無法編寫沒有設置值的TUnion

[英]java.io.IOException: org.apache.thrift.protocol.TProtocolException: Cannot write a TUnion with no set value

我正在使用Thrift方案將Thrift捆綁包作為桶文件存儲在hadoop集群中。 一切似乎都正常工作。 創建了Thrift捆綁包,沒有任何錯誤。

雖然,我正在使用kafka發送捆綁包,並在進行序列化時,序列化程序功能將捆綁包轉換為字節數組。這時我遇到了上述錯誤。 為什么kafka會尋找捆綁對象以將其轉換為字節數組。 或者有什么方法可以安全地將任何對象轉換為字節數組,如果可以,請提供它,錯誤是:

java.io.IOException: org.apache.thrift.protocol.TProtocolException: Cannot write a TUnion with no set value!

以下是引發錯誤的writeObject函數

private void writeObject(java.io.ObjectOutputStream out)
        throws java.io.IOException {
    try {
        write(new org.apache.thrift.protocol.TCompactProtocol(
                new org.apache.thrift.transport.TIOStreamTransport(out)));
    } catch (org.apache.thrift.TException te) {
        throw new java.io.IOException(te);
    }
}

消息很清楚:在某個union對象的某處未設置任何值。 必須為Thrift聯合設置一個值。

節儉聯合示例,請參閱您的* .thrift文件:

union Foo {
  1: string bar
  2: bool baz
}

這是引發錯誤的條件:

public void write(TProtocol oprot, TUnion struct) throws TException {
  if (struct.getSetField() == null || struct.getFieldValue() == null) {
    throw new TProtocolException("Cannot write a TUnion with no set value!");
  }

  // ... more code ...
}

從給定的代碼中無法分辨出它是什么對象,您的堆棧太深了。 查看調用writeObject()的代碼,然后向上移動。 在代碼的某些地方,未按預期設置某些數據,或者該值設置為null值-這在Thrift中是非法的。 如果確實需要用例指示null值,請考慮使用額外的布爾值標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM