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
相关产品推荐
相关产品推荐

