代码之家  ›  专栏  ›  技术社区  ›  Alexander Kondaurov

scalapb生成的proto中的未知字段

  •  1
  • Alexander Kondaurov  · 技术社区  · 8 年前

    我对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被注释

    以及相应生成的原型文件:

    // 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
    }
    

    我检查CalcServiceProto。intellj idea中的javaDescriptor:

    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: "*"
      }
    }
    

    可能是因为我没有像generator那样注册扩展,所以这种方式的工作方式有所不同。

    我希望以任何方式通过此测试:

      val s = CalcServiceProto.javaDescriptor.getServices.get(0)
    
      val m = s.getMethods.get(0)
    
      m.getOptions.getExtension(AnnotationsProto.http).getPost shouldBe "/calcService/sum"
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   thesamet    8 年前

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

    当Java转换被禁用时,ScalaPB会解析描述符,但它不能保证Java扩展被编译,所以它不会尝试注册它们。

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

    同时,正如我上面所写的,您可以使用java转换来强制ScalaPB为您提供java描述符。在您的构建中。sbt,具有:

    PB.targets in Compile := Seq(
      scalapb.gen(grpc=true, javaConversions=true) -> (sourceManaged in Compile).value,
      PB.gens.java -> (sourceManaged in Compile).value
    )
    
    推荐文章