I have a Spring Webflux application that has grpc service.
Also I have component annotated by @GrpcAdvice for handling all exceptions.
When I get an exception from my service, I log it and call responseObserver#onError to my global grpc-exception handler handle the exception, but it doesn’t. I even don’t see log from the handling method.
dependency for gRPC support I use is
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-spring-boot-starter</artifactId>
<version>2.14.0.RELEASE</version>
</dependency>
Here is my Grpc service
import com.im.grpc.session.SessionGrpc;
import io.grpc.stub.StreamObserver;
import lombok.extern.slf4j.Slf4j;
import net.devh.boot.grpc.server.service.GrpcService;
import static com.im.grpc.session.SessionService.*;
@Slf4j
@GrpcService
public class SessionServiceGrpc extends SessionGrpc.SessionImplBase {
private final SessionComponent sessionComponent;
public SessionServiceGrpc(SessionComponent sessionComponent) {
this.sessionComponent = sessionComponent;
}
@Override
public void create(SessionRequest request, StreamObserver<SessionResponse> responseObserver) {
sessionComponent.create(request.getTtl(), request.getRequester())
.subscribe(sid -> {
var response = SessionResponse.newBuilder()
.setSid(sid).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}, throwable -> {
log.error("Error occurred: ", throwable);
responseObserver.onError(throwable);
});
}
}
and here is global grpc exception handler
import com.google.protobuf.Any;
import com.google.rpc.Code;
import com.google.rpc.ErrorInfo;
import com.inlove.im.session.SessionException;
import io.grpc.StatusRuntimeException;
import io.grpc.protobuf.StatusProto;
import io.grpc.stub.StreamObserver;
import lombok.extern.slf4j.Slf4j;
import net.devh.boot.grpc.server.advice.GrpcAdvice;
import net.devh.boot.grpc.server.advice.GrpcExceptionHandler;
@Slf4j
@GrpcAdvice
public class GrpcServiceAdvice {
@GrpcExceptionHandler(SessionException.class)
public StatusRuntimeException handleResourceNotFoundException(SessionException cause) {
log.info("gotten exception", cause);
var errorInfo =
ErrorInfo.newBuilder()
.setReason("test")
.setDomain("test")
.build();
var status =
com.google.rpc.Status.newBuilder()
.setCode(Code.NOT_FOUND.getNumber())
.setMessage("test")
.addDetails(Any.pack(errorInfo))
.build();
return StatusProto.toStatusRuntimeException(status);
}
}
There is log ‘Error occurred: …’ from the service, but no ‘gotten exception’ from the handler.