ScalaPB compilePlugin生成不符合预期的Scala case类问题求助
原因分析
你当前得到的生成结果是ScalaPB的默认输出,不符合预期通常是默认配置规则和你的需求不匹配导致,常见的差异点原因如下:
time字段被包装为Option类型:google.protobuf.Timestamp属于Message类型,ScalaPB默认将所有Message类型字段生成为Option类型,避免空指针异常。- 存在
unknownFields字段、__computeSerializedValue等序列化相关代码:这是ScalaPB为了实现Protobuf序列化、兼容未知字段默认生成的标准逻辑。 - 基础类型字段默认值为0:符合proto3协议的默认值规范,未显式赋值的int32类型字段默认取0值。
修复方案
根据你的实际需求调整scalapb.gen的配置即可:
方案1:取消Message类型字段的Option包装
如果要求time字段必须赋值、不需要Option包装,可以修改build.sbt中的配置:
Compile / PB.targets := Seq( scalapb.gen( // 全局禁用非optional的Message字段的Option包装 optionalFieldStyle = scalapb.OptionalFieldStyle.NO_OPTION ) -> (Compile / sourceManaged).value )
如果只需要单独取消time字段的Option包装,不用全局调整,可以修改.proto文件:
首先导入ScalaPB的选项定义:
import "scalapb/scalapb.proto";
然后修改字段配置:
google.protobuf.Timestamp time = 4 [(scalapb.field).no_box = true];
方案2:移除序列化相关逻辑和unknownFields字段
如果只需要纯净的case类,不需要Protobuf序列化能力,可以调整配置:
Compile / PB.targets := Seq( scalapb.gen( noUnknownFields = true, // 移除unknownFields字段 lenses = false, // 移除lenses更新相关代码 retainSourceCodeInfo = false ) -> (Compile / sourceManaged).value )
方案3:取消基础类型字段的默认值
如果不希望int32类型字段有默认0值,要求必须显式赋值,可以添加配置:
scalapb.gen(noDefaultValuesInConstructor = true) -> (Compile / sourceManaged).value
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

