Java 覆盖协议缓冲区将null设置为字段时引发NPE的默认行为

Java 覆盖协议缓冲区将null设置为字段时引发NPE的默认行为,java,protocol-buffers,Java,Protocol Buffers,我使用protocol buffers maven插件编译.proto文件。我真的很喜欢协议缓冲区,除了一件事,它不接受空值作为默认值或无值。相反,只要传递null,它就会抛出NPE。防止这种NPE不必要地使代码膨胀,太多了&无论如何,我真的想避免这种情况 我看到这个请求/问题被社区强烈提出,并被PB团队拒绝。现在,我正在寻找任何方法,通过自己修改/实现任何类来覆盖这种行为,以便编译我的原型文件以生成不会将NPE置为空的代码。有人能建议怎么做吗? 还是有更简单的方法 现在我正在寻找任何方法,我可

我使用protocol buffers maven插件编译
.proto
文件。我真的很喜欢协议缓冲区,除了一件事,它不接受空值作为默认值或无值。相反,只要传递
null
,它就会抛出NPE。防止这种NPE不必要地使代码膨胀,太多了&无论如何,我真的想避免这种情况

我看到这个请求/问题被社区强烈提出,并被PB团队拒绝。现在,我正在寻找任何方法,通过自己修改/实现任何类来覆盖这种行为,以便编译我的原型文件以生成不会将NPE置为空的代码。有人能建议怎么做吗? 还是有更简单的方法

现在我正在寻找任何方法,我可以通过修改/实现任何类来覆盖这种行为,这样我的原型文件就可以被编译来生成不需要修改的代码;不要在空值上抛出NPE

简单地说,您需要更改消息生成器代码。这很复杂,但没那么复杂。缺点是它在C++中…当然,你需要在将来维护你的叉子,或者被当前形式的protobuf卡住

你可能想从看和开始

我估计这只需要几天的工作,如果是这样的话-但你将永远承担一个小的但目前的维护负担


当然,另一种选择是完全自己从头开始重写消息生成-这显然是一项更大的任务,但我最终还是为我的项目完成了这项任务。。。在获得C++版本工作之后。(我的端口采用相同的非空方法。)

huh;)有没有更简单的方法呢?@user01:没有,我不这么认为。这不是生成代码的工作方式,更改生成器将是使其按您希望的方式运行的最简单方法。就我个人而言,我也希望它能以这种方式工作,但充其量只能是一种选择,因为改变它会改变大量代码的行为。(您还需要考虑所有原始的设置器是否应该使用包装类型,以允许字段通过NULL传递来清除。)