javaspringgrpc

@GrpcClient is null spring boot 3


I am making grpc client using net.devh.grpc-client-spring-boot-starter

Client:

@Service
public class SystemService {
    @GrpcClient("handyman-client")
    StatusServiceGrpc.StatusServiceBlockingStub handymanClient;

    public VersionResponse getHandymanVersion() {
        return handymanClient.getVersion(Empty.newBuilder().build());
    }
}

application.yaml:

grpc:
  client:
    handyman-client:
      address: static://localhost:8080
      negotiationType: plaintext

In runtime handymanClient is null. Tried spring boot versions from 3.0.0 to 3.0.2. Lowering the spring boot version to 2.7.0 solves the problem - the client is being created now.

Is there a workaround to make it work on spring boot 3?

build.gradle:

plugins {
id 'java'
id 'org.springframework.boot' version '3.0.0'
id 'io.spring.dependency-management' version '1.1.0'
id "com.google.protobuf" version "0.9.2"
}

group = 'hello.grpc'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {
compileOnly {
    extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'io.micrometer:micrometer-registry-prometheus'
implementation 'javax.annotation:javax.annotation-api:1.3.2'

implementation group: 'net.devh', name: 'grpc-client-spring-boot-starter', version: '2.13.0.RELEASE'
implementation group: 'io.grpc', name: 'grpc-stub', version: '1.53.0'
implementation group: 'io.grpc', name: 'grpc-protobuf', version: '1.53.0'

}

sourceSets {
main {
    java {
        srcDirs 'build/generated/source/proto/main/grpc'
        srcDirs 'build/generated/source/proto/main/java'
    }
}
}

protobuf {
protoc {
    artifact = 'com.google.protobuf:protoc:4.0.0-rc-2'
}
plugins {
    grpc {
        artifact = 'io.grpc:protoc-gen-grpc-java:1.53.0'
    }
}
generateProtoTasks {
    all()*.plugins {
        grpc {}
    }
}
}

tasks.named('test') {
useJUnitPlatform()
}

springBoot {
buildInfo()
}


Solution

  • Based on this issue you must use the following configuration in your project :

    import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ImportAutoConfiguration({
            net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration.class,
            net.devh.boot.grpc.client.autoconfigure.GrpcClientMetricAutoConfiguration.class,
            net.devh.boot.grpc.client.autoconfigure.GrpcClientHealthAutoConfiguration.class,
            net.devh.boot.grpc.client.autoconfigure.GrpcClientSecurityAutoConfiguration.class,
            net.devh.boot.grpc.client.autoconfigure.GrpcClientTraceAutoConfiguration.class,
            net.devh.boot.grpc.client.autoconfigure.GrpcDiscoveryClientAutoConfiguration.class,
    
            net.devh.boot.grpc.common.autoconfigure.GrpcCommonCodecAutoConfiguration.class,
            net.devh.boot.grpc.common.autoconfigure.GrpcCommonTraceAutoConfiguration.class,
    
            net.devh.boot.grpc.server.autoconfigure.GrpcAdviceAutoConfiguration.class,
            net.devh.boot.grpc.server.autoconfigure.GrpcHealthServiceAutoConfiguration.class,
            net.devh.boot.grpc.server.autoconfigure.GrpcMetadataConsulConfiguration.class,
            net.devh.boot.grpc.server.autoconfigure.GrpcMetadataEurekaConfiguration.class,
            net.devh.boot.grpc.server.autoconfigure.GrpcMetadataNacosConfiguration.class,
            net.devh.boot.grpc.server.autoconfigure.GrpcMetadataZookeeperConfiguration.class,
            net.devh.boot.grpc.server.autoconfigure.GrpcReflectionServiceAutoConfiguration.class,
            net.devh.boot.grpc.server.autoconfigure.GrpcServerAutoConfiguration.class,
            net.devh.boot.grpc.server.autoconfigure.GrpcServerFactoryAutoConfiguration.class,
            net.devh.boot.grpc.server.autoconfigure.GrpcServerMetricAutoConfiguration.class,
            net.devh.boot.grpc.server.autoconfigure.GrpcServerSecurityAutoConfiguration.class,
            net.devh.boot.grpc.server.autoconfigure.GrpcServerTraceAutoConfiguration.class
    })
    public class GrpcConfig {
    }