在java中处理proto文件时,为什么对象列表没有设置为列表,而不是为每个值设置重复的键

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

我有一个下面的原型文件

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.anusoft";

message Request {
    repeated string subjects = 1;
}

当我编译它并尝试构造其对象时,如下所示:

Request request1 = Request.newBuilder()
            .setSubjects(0, "Maths")
            .setSubjects(1, "Science")
            .build();

我收到以下错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    java.util.ArrayList.set(ArrayList.java:448)
    at com.google.protobuf.LazyStringArrayList.set(LazyStringArrayList.java:140)
    at com.google.protobuf.LazyStringArrayList.set(LazyStringArrayList.java:61)
    at com.anusoft.Request$Builder.setSubjects(Request.java:468)
    at com.anusoft.grpc.Main.main(Main.java:8)

当我尝试构造如下对象时:

Request request2 = Request.newBuilder()
            .addAllSubjects(Arrays.asList("Maths", "Science"))
            .build();

打印对象时,我得到如下响应:

subjects: "Maths"
subjects: "Science"

但我希望它是这样的:

subjects: ["Maths", "Science"]

这是我提出的一种虚拟示例。与此类似,我有一个请求对象原型文件,我已将其编译为 java,当我尝试构造一个 Request 对象以请求服务器发送响应时。请求是以这种方式创建的,但由于请求对象格式错误,请求未得到处理。

服务器是用.net编写的,他们为我们提供了proto文件,以便我们可以将它们转换为java文件并调用他们的方法来获取响应。我已经编译了它们并使用生成的方法来设置请求对象中的字段,但是当涉及到重复字段时。他们就是这样形成的,我无法得到回应。

如果有任何内容不完整或含糊,请告诉我。

任何帮助将不胜感激! :)

java protocol-buffers grpc rpc grpc-java
1个回答
0
投票

您可以尝试下面的方法,而不是将主题添加为列表吗

 Request request = Request.newBuilder()
        .addSubject("Maths")
        .addSubject("Science")
        .build();
© www.soinside.com 2019 - 2024. All rights reserved.