scalapb生成的proto中的未知字段

问题描述 投票:1回答:1

我是scalapb和protobuf的新手。

我正在尝试为我的scalapb发电机创建单元测试。我已经生成了proto文件并尝试在测试中使用它们。

我有这个原型文件:

syntax = "proto3";

package hellogrpc.calc;

import "google/api/annotations.proto";

option (scalapb.options) = {
  flat_package: true
};

service CalcService {

    rpc CalcSum (SumRequest) returns (CalcResponse) {
        option (google.api.http) = {
          post: "/calcService/sum"
          body: "*"
        };
    }

}

有方法CalcSum注释

和相应的生成的proto文件:

// Generated by the Scala Plugin for the Protocol Buffer Compiler.
// Do not edit!
//
// Protofile syntax: PROTO3

package hellogrpc.calc



object CalcServiceProto extends _root_.com.trueaccord.scalapb.GeneratedFileObject {
  lazy val dependencies: Seq[_root_.com.trueaccord.scalapb.GeneratedFileObject] = Seq(
    com.trueaccord.scalapb.scalapb.ScalapbProto,
    com.google.api.annotations.AnnotationsProto
  )
  lazy val messagesCompanions: Seq[_root_.com.trueaccord.scalapb.GeneratedMessageCompanion[_]] = Seq(
    hellogrpc.calc.SumRequest,
    hellogrpc.calc.CalcResponse
  )
  private lazy val ProtoBytes: Array[Byte] =
      com.trueaccord.scalapb.Encoding.fromBase64(scala.collection.Seq(
  """ChtoZWxsb2dycGMvQ2FsY1NlcnZpY2UucHJvdG8SDmhlbGxvZ3JwYy5jYWxjGhVzY2FsYXBiL3NjYWxhcGIucHJvdG8aHGdvb
  2dsZS9hcGkvYW5ub3RhdGlvbnMucHJvdG8iKAoKU3VtUmVxdWVzdBIMCgFhGAEgASgFUgFhEgwKAWIYAiABKAVSAWIiJgoMQ2FsY
  1Jlc3BvbnNlEhYKBnJlc3VsdBgBIAEoBVIGcmVzdWx0Mm8KC0NhbGNTZXJ2aWNlEmAKB0NhbGNTdW0SGi5oZWxsb2dycGMuY2FsY
  y5TdW1SZXF1ZXN0GhwuaGVsbG9ncnBjLmNhbGMuQ2FsY1Jlc3BvbnNlIhuC0+STAhUiEC9jYWxjU2VydmljZS9zdW06ASpCBeI/A
  hABYgZwcm90bzM="""
      ).mkString)
  lazy val scalaDescriptor: _root_.scalapb.descriptors.FileDescriptor = {
    val scalaProto = com.google.protobuf.descriptor.FileDescriptorProto.parseFrom(ProtoBytes)
    _root_.scalapb.descriptors.FileDescriptor.buildFrom(scalaProto, dependencies.map(_.scalaDescriptor))
  }
  lazy val javaDescriptor: com.google.protobuf.Descriptors.FileDescriptor = {
    val javaProto = com.google.protobuf.DescriptorProtos.FileDescriptorProto.parseFrom(ProtoBytes)
    com.google.protobuf.Descriptors.FileDescriptor.buildFrom(javaProto, Array(
      com.trueaccord.scalapb.scalapb.ScalapbProto.javaDescriptor,
      com.google.api.annotations.AnnotationsProto.javaDescriptor
    ))
  }
  @deprecated("Use javaDescriptor instead. In a future version this will refer to scalaDescriptor.", "ScalaPB 0.5.47")
  def de
```scriptor: com.google.protobuf.Descriptors.FileDescriptor = javaDescriptor
}

我在intellij想法中检查了CalcService Proto.java Descriptor:

enter image description here

方法描述符具有此原型定义:

name: "CalcSum"
input_type: ".hellogrpc.calc.SumRequest"
output_type: ".hellogrpc.calc.CalcResponse"
options {
  72295728: "\"\020/calcService/sum:\001*"
}

但发电机工作正常!我调试生成器,在生成器上切换断点和方法CalcSum有这个原型定义:

name: "CalcSum"
input_type: ".hellogrpc.calc.SumRequest"
output_type: ".hellogrpc.calc.CalcResponse"
options {
  [google.api.http] {
    post: "/calcService/sum"
    body: "*"
  }
}

可能这是有效的,因为我没有像发电机那样注册扩展。

我希望通过这种测试的任何方式:

  val s = CalcServiceProto.javaDescriptor.getServices.get(0)

  val m = s.getMethods.get(0)

  m.getOptions.getExtension(AnnotationsProto.http).getPost shouldBe "/calcService/sum"
scala protocol-buffers scalapb
1个回答
2
投票

如果您需要Java扩展可用,则需要在启用Java转换的情况下生成代码。这将使javaDescriptor依赖于官方的Java实现,并且您的测试将通过。

禁用Java转换时,ScalaPB会解析描述符,但不能保证Java扩展甚至已编译,因此它不会尝试注册它们。

我想要的是Scala描述符在这种情况下可以工作,但它们还没有支持服务和方法。我提交了https://github.com/scalapb/ScalaPB/issues/382来跟踪这方面的进展。

与此同时,如上所述,您可以使用java转换强制ScalaPB为您提供Java描述符。在你的build.sbt中,有:

PB.targets in Compile := Seq(
  scalapb.gen(grpc=true, javaConversions=true) -> (sourceManaged in Compile).value,
  PB.gens.java -> (sourceManaged in Compile).value
)
© www.soinside.com 2019 - 2024. All rights reserved.