Protobuf 3.0 Map导致J9VM中的java.lang.ExceptionInInitializerError:null

时间:2016-11-11 07:48:52

标签: java protocol-buffers

这是我的原型:

proto
message TransactionRecord {
……
    map<string, string> parameters = 19;
……
}

然后,我使用以下代码来获取构建器

java
final TransactionRecord.Builder metaDataBuilder = requestBuilder.getMetaData().toBuilder();

此代码在许多JVM中运行良好,但在J9VM中失败

以下例外:

java.lang.ExceptionInInitializerError: null
        at java.lang.J9VMInternals.initialize(J9VMInternals.java:222) ~[na:1.6.0]
        at com.blueware.deps.com.google.protobuf.MapField.mergeFrom(MapField.java:204) ~[oneapm.jar:2.0]
        at com.blueware.monitor.collector.grpc.TransactionRecord$Builder.mergeFrom(TransactionRecord.java:1323) ~[oneapm.jar:2.0]
        at com.blueware.monitor.collector.grpc.TransactionRecord.toBuilder(TransactionRecord.java:1062) ~[oneapm.jar:2.0]
        at com.blueware.monitor.transaction.TransactionDataCompressorFactoryService.compressMetaData(TransactionDataCompressorFactoryS
ervice.java:401) ~[oneapm.jar:2.0]
        at com.blueware.monitor.transaction.TransactionDataCompressorFactoryService.compress(TransactionDataCompressorFactoryService.j
        at weblogic.deploy.internal.targetserver.BasicDeployment.activateFromServerLifecycle(BasicDeployment.java:361) [weblogic.jar:1
0.3.6.0]
        at weblogic.management.deploy.internal.ConfiguredDeployments.deployPreStandbyInternalApps(ConfiguredDeployments.java:85) [webl
ogic.jar:10.3.6.0]
        at weblogic.management.deploy.internal.DeploymentServerService.deployPreStandbyInternalApps(DeploymentServerService.java:168)
[weblogic.jar:10.3.6.0]
        at weblogic.management.deploy.internal.DeploymentPreStandbyServerService.start(DeploymentPreStandbyServerService.java:27) [web
logic.jar:10.3.6.0]
        at weblogic.t3.srvr.SubsystemRequest.run(SubsystemRequest.java:64) [weblogic.jar:10.3.6.0]
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256) [com.bea.core.weblogic.workmanager_1.11.0.0.jar:1.11.0.0]
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:221) [com.bea.core.weblogic.workmanager_1.11.0.0.jar:1.11.0.0]
Caused by: java.lang.UnsupportedOperationException: null
        at com.blueware.deps.com.google.protobuf.MapFieldLite.ensureMutable(MapFieldLite.java:221) ~[oneapm.jar:2.0]
        at com.blueware.deps.com.google.protobuf.MapFieldLite.putAll(MapFieldLite.java:99) ~[oneapm.jar:2.0]
        at java.util.LinkedHashMap.<init>(LinkedHashMap.java:112) ~[na:na]
        at com.blueware.deps.com.google.protobuf.MapFieldLite.<init>(MapFieldLite.java:56) ~[oneapm.jar:2.0]
        at com.blueware.deps.com.google.protobuf.MapFieldLite.<clinit>(MapFieldLite.java:61) ~[oneapm.jar:2.0]
        at java.lang.J9VMInternals.initializeImpl(Native Method) ~[na:1.6.0]
        at java.lang.J9VMInternals.initialize(J9VMInternals.java:200) ~[na:1.6.0]
        ... 45 common frames omitted

我试图删除map parameters以进行定义,它很好。

相反,我使用final TransactionRecord.Builder metaDataBuilder = requestBuilder.getMetaDataBuilder();,无法解决此问题。仍然在J9VM上失败

这个错误是怎么发生的?

这是地图的错误吗?

1 个答案:

答案 0 :(得分:0)

我已经解决了我的问题。已经确认,这是protobuf bug,当它在J9VM上运行时。

当在IBM J9上初始化MapFieldLite中的静态字段EMPTY_MAP_FIELD时,putAll被覆盖并调用ensureMutable。并且ensureMutable在其超类LinkedHashMap中被调用,当isMutable在那时设置为false时,会导致引发UnsupportedOperationException。

更多信息,您可以阅读此RP。

RP已被 protobuf-java 合并,RP is here