use of io.scalecube.services.api.ServiceMessage in project scalecube by scalecube.
the class ServiceMethodInvokerTest method testInvokeOneWhenThrowException.
@Test
@DisplayName("invokeOne should return error response when service throws exception")
void testInvokeOneWhenThrowException() throws Exception {
final String methodName = "throwException";
final Class<? extends StubService> serviceClass = stubService.getClass();
final Method method = serviceClass.getMethod(methodName);
final MethodInfo methodInfo = new MethodInfo(serviceClass.getName(), methodName, method.getReturnType(), IS_RETURN_TYPE_SERVICE_MESSAGE, CommunicationMode.REQUEST_RESPONSE, method.getParameterCount(), Void.TYPE, IS_REQUEST_TYPE_SERVICE_MESSAGE, AUTH);
serviceMethodInvoker = new ServiceMethodInvoker(method, stubService, methodInfo, DefaultErrorMapper.INSTANCE, dataDecoder, nullAuthenticator, nullPrincipalMapper);
ServiceMessage message = ServiceMessage.builder().qualifier(qualifierPrefix + methodName).build();
// invokeOne
final Mono<ServiceMessage> invokeOne = Mono.deferContextual(context -> serviceMethodInvoker.invokeOne(message)).contextWrite(context -> context.put(AUTH_CONTEXT_KEY, AUTH_DATA));
StepVerifier.create(invokeOne).assertNext(serviceMessage -> Assertions.assertTrue(serviceMessage.isError())).verifyComplete();
}
use of io.scalecube.services.api.ServiceMessage in project scalecube by scalecube.
the class ServiceMethodInvoker method toRequest.
private Object toRequest(ServiceMessage message) {
ServiceMessage request = dataDecoder.apply(message, methodInfo.requestType());
if (!methodInfo.isRequestTypeVoid() && !methodInfo.isRequestTypeServiceMessage() && !request.hasData(methodInfo.requestType())) {
Optional<?> dataOptional = Optional.ofNullable(request.data());
Class<?> clazz = dataOptional.map(Object::getClass).orElse(null);
throw new BadRequestException(String.format("Expected service request data of type: %s, but received: %s", methodInfo.requestType(), clazz));
}
return methodInfo.isRequestTypeServiceMessage() ? request : request.data();
}
Aggregations