我正在使用Netflix Feign,将Microservice A的一个操作调用到Microservice B的另一个操作,后者使用Spring Boot验证代码。
如果验证失败,则Microservice B的操作会抛出异常。然后我在微服务中进行处理,并返回HttpStatus.UNPROCESSABLE_ENTITY
(422),如下所示:
@ExceptionHandler({
ValidateException.class
})
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
@ResponseBody
public Object validationException(final HttpServletRequest request, final validateException exception) {
log.error(exception.getMessage(), exception);
error.setErrorMessage(exception.getMessage());
error.setErrorCode(exception.getCode().toString());
return error;
}
因此,当微服务A在接口中调用B时,如下所示:
@Headers("Content-Type: " + MediaType.APPLICATION_JSON_UTF8_VALUE)
@RequestLine("GET /other")
void otherOperation(@Param("other") String other );
@Headers("Content-Type: " + MediaType.APPLICATION_JSON_UTF8_VALUE)
@RequestLine("GET /code/validate")
Boolean validate(@Param("prefix") String prefix);
static PromotionClient connect() {
return Feign.builder()
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.target(PromotionClient.class, Urls.SERVICE_URL.toString());
}
当验证失败时,它会返回一个内部错误500,并显示以下消息:
and the validations fails it returns a internal error 500 with next message:
{
"timestamp": "2016-08-05T09:17:49.939+0000",
"status": 500,
"error": "Internal Server Error",
"exception": "feign.FeignException",
"message": "status 422 reading Client#validate(String); content:\n{\r\n \"errorCode\" : \"VALIDATION_EXISTS\",\r\n \"errorMessage\" : \"Code already exists.\"\r\n}",
"path": "/code/validate"
}
但我需要返回与微服务操作B相同的内容。
使用Netflix Feign在微服务中传播状态和异常的最佳方法或技术是什么?
decode
方法的methodKey
参数。根据API文档,它应该包含调用请求的Java方法的{@link feign.Feign#configKey}
。例如:{@code IAM#getUser()}。这样可以给你提供上下文的线索。 - Mathias Dpunkt