You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java gRPC中嵌套类ConfigFileInfo未生成的问题求助

问题:Java gRPC客户端无法找到嵌套生成类ConfigFileInfo

我是Java新手,想要通过gRPC远程控制一个C#应用。C#应用会向Java端发送GetTaskConfigsReply消息,C#端运行正常,但在Java中,嵌套类ConfigFileInfo并未生成,无法找到该类。

提供的相关代码片段

Proto文件

syntax = "proto3";

service RemoteControl {
  rpc GetTaskConfigs(GetTaskConfigsRequest) returns (GetTaskConfigsReply);
  
}

message GetTaskConfigsRequest {

}

message GetTaskConfigsReply{
  message ConfigFileInfo{
    string name = 1;
    string path = 2;
    string modified_time = 3;
  }
  repeated ConfigFileInfo configs = 1;
}

pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>xx</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>xx</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

 <!-- <repositories>
    <repository>
        <id>google-maven</id>
        <name>Google Maven Repository</name>
        <url>https://maven.pkg.github.com/grpc/grpc-java</url>
    </repository>
</repositories> -->


  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-netty-shaded</artifactId>
      <version>1.41.3</version>
    </dependency>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-protobuf</artifactId>
      <version>1.41.3</version>
    </dependency>
    <dependency>
      <groupId>io.grpc</groupId>
      <artifactId>grpc-stub</artifactId>
      <version>1.41.3</version>
    </dependency>
    <dependency> <!-- necessary for Java 9+ -->
      <groupId>org.apache.tomcat</groupId>
      <artifactId>annotations-api</artifactId>
      <version>6.0.53</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to
      parent pom) -->
      <plugins>
        <!-- clean lifecycle, see
        https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see
        https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see
        https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <extensions>
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.7.1</version>
      </extension>
    </extensions>
    <plugins>
      <plugin>
        <groupId>org.xolstice.maven.plugins</groupId>
        <artifactId>protobuf-maven-plugin</artifactId>
        <version>0.6.1</version>
        <configuration>
          <protocArtifact>com.google.protobuf:protoc:3.19.6:exe:${os.detected.classifier}</protocArtifact>
          <pluginId>grpc-java</pluginId>
          <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.41.3:exe:${os.detected.classifier}</pluginArtifact>
          <clearOutputDirectory>false</clearOutputDirectory>
          <outputDirectory>${basedir}/src/main/java</outputDirectory>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>compile-custom</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

原Java代码片段

private static List<ConfigFileInfo> GetTaskConfigs(RemoteControlBlockingStub remoteControlBlockingStub) {
        GetTaskConfigsRequest request = GetTaskConfigsRequest.newBuilder().build();

        GetTaskConfigsReply reply = remoteControlBlockingStub.getTaskConfigs(request);
        List<ConfigFileInfo> configFileInfos = new ArrayList<ConfigFileInfo>();
        for (int i = 0; i < reply.getConfigsCount(); i++) {
            configFileInfos.add(reply.getConfigs(i));
        }
        return configFileInfos;
    }

解决方案

1. 修正嵌套类的引用方式

Protobuf在Java中生成的嵌套消息类是作为外部消息类的静态内部类存在的,你不能直接使用ConfigFileInfo,必须通过GetTaskConfigsReply.ConfigFileInfo来引用。

2. 重新生成代码

执行Maven命令清理并重新编译,确保生成最新的Protobuf类:

mvn clean compile

检查src/main/java下对应包路径中的GetTaskConfigsReply.java文件,确认其中包含public static final class ConfigFileInfo的定义。

3. 修改Java代码

将原代码中的ConfigFileInfo替换为GetTaskConfigsReply.ConfigFileInfo,修正后的代码如下:

private static List<GetTaskConfigsReply.ConfigFileInfo> GetTaskConfigs(RemoteControlBlockingStub remoteControlBlockingStub) {
        GetTaskConfigsRequest request = GetTaskConfigsRequest.newBuilder().build();

        GetTaskConfigsReply reply = remoteControlBlockingStub.getTaskConfigs(request);
        List<GetTaskConfigsReply.ConfigFileInfo> configFileInfos = new ArrayList<>();
        for (int i = 0; i < reply.getConfigsCount(); i++) {
            configFileInfos.add(reply.getConfigs(i));
        }
        return configFileInfos;
    }

4. 额外检查(可选)

如果你的proto文件添加了package声明,比如package com.mycompany.app;,请确保在Java代码中导入了对应的包:

import com.mycompany.app.GetTaskConfigsReply;
import com.mycompany.app.RemoteControlGrpc;

内容的提问来源于stack exchange,提问作者nsj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:14:51