ScalaPB编译Proto对象报错:isEmpty方法重复定义如何解决?
ScalaPB生成代码时
isEmpty方法冲突的解决办法 问题背景
现有不可修改的ProtoBuf定义如下:
... message Condition { oneof condition_one_of { FieldCondition field = 1; IsEmptyCondition is_empty = 2; HasIdCondition has_id = 3; Filter filter = 4; IsNullCondition is_null = 5; NestedCondition nested = 6; } } message IsEmptyCondition { string key = 1; } message IsNullCondition { string key = 1; } ...
运行ScalaPB代码生成任务时,出现以下方法重复定义错误:
[error] /Users/pippo/qdrant4s/target/scala-2.13/src_managed/main/scalapb/qdrant/points/Condition.scala:210:9: method isEmpty is defined twice; [error] the conflicting method isEmpty was defined at line 201:9 [error] def isEmpty: _root_.scala.Option[qdrant.points.IsEmptyCondition] = _root_.scala.None
解决办法
问题根源是ScalaPB默认将oneof字段is_empty映射为Scala方法isEmpty(),该方法名与生成代码的其他逻辑产生冲突。可通过ScalaPB的代码生成参数重命名该方法:
方法1:重命名单个oneof字段的getter
在项目build.sbt中修改ScalaPB的protoc选项,添加字段重命名规则:
PB.protocOptions in Compile += "--scala_out=rename_oneof_getters=is_empty:getIsEmptyCondition"
此配置会将is_empty字段对应的getter方法重命名为getIsEmptyCondition,避免与原有isEmpty方法冲突。
方法2:通过字段路径精确映射
如果需要更精确的控制,可指定完整字段路径来重命名(注意替换为实际项目的包名):
PB.protocOptions in Compile += "--scala_out=field_name_mapping=qdrant.points.Condition.condition_one_of.is_empty:getIsEmptyCondition"
验证修改
修改配置后重新运行ScalaPB代码生成任务(如sbt compile),生成的Condition.scala中,原isEmpty方法会被替换为指定的新方法名,冲突即可解决。
内容的提问来源于stack exchange,提问作者mfirry
相关产品推荐
相关产品推荐

