我在Spring Boot应用程序中有多个伪装客户端。我正在使用控制器建议来处理每个假客户端的自定义异常。
我的控制器建议处理两个自定义异常(每个客户端一个:client1和client2):
@ControllerAdvice
public class ExceptionTranslator implements ProblemHandling {
@ExceptionHandler
public ResponseEntity<Problem> handleCustomClient1Exception(CustomException1 ex, NativeWebRequest request) {
Problem problem = Problem.builder()
.title(ex.getTitle())
.detail(ex.getMessage())
.status(ex.getStatusType())
.code(ex.getCode())
.build();
return create(ex, problem, request);
}
@ExceptionHandler
public ResponseEntity<Problem> handleCustomClient2Exception(CustomException2 ex, NativeWebRequest request) {
Problem problem = Problem.builder()
.title(ex.getTitle())
.detail(ex.getMessage())
.status(ex.getStatusType())
.code(ex.getCode())
.build();
return create(ex, problem, request);
}
}
我已经为伪装的client1实现了一个错误解码器。
public class ClientErrorDecoder implements ErrorDecoder {
final ObjectMapper mapper;
public ClientErrorDecoder() {
this.mapper = new ObjectMapper();
}
@Override
public Exception decode(String methodKey, Response response) {
ExceptionDTO exceptionDTO;
try {
exceptionDTO = mapper.readValue(response.body().asInputStream(), ExceptionDTO.class);
} catch (IOException e) {
throw new RuntimeException("Failed to process response body.", e);
}
return new CustomException1(exceptionDTO.getDetail(), exceptionDTO.getCode(), exceptionDTO.getTitle(), exceptionDTO.getStatus());
}
}
我还配置了伪装,以便针对该特定客户端使用该错误解码器,如下所示:
feign:
client:
config:
client1:
errorDecoder: feign.codec.ErrorDecoder.Default
我的问题是:处理多个假客户端异常的最佳方法是什么?我应该使用相同的错误解码器,并将其响应视为一般异常吗?还是应该为每个假冒客户创建一个错误解码器?
答案 0 :(得分:0)
快速解答
如果使用不同的API,错误响应的格式将不同。因此,分别处理它们似乎是最好的方法。
备注
在您的示例中,您似乎定义了一个自定义ErrorDecoder
不使用,因为您还配置了伪装以在属性文件中为client1使用默认错误解码器。
即使您在某个地方使用自定义@Configuration
的bean定义了ClientErrorDecoder
类,
Spring Cloud documentation提到配置属性优先于@Configuration
批注
如果我们同时创建@Configuration bean和配置属性, 配置属性将获胜。它将覆盖@Configuration 价值观。但是,如果要将优先级更改为@Configuration,则可以 可以将feign.client.default-to-properties更改为false。
示例
这是一个假设的修剪配置,可使用不同的错误解码器处理多个假客户端:
Client1 :
您告诉假装为客户端1加载CustomFeignConfiguration
类中定义的bean
@FeignClient(name = "client1", configuration = {CustomFeignConfiguration.class})
public interface Client1 {...}
Client2 :
Client2将使用默认的Feign ErrorDecoder
,因为未指定配置。 (错误时将抛出FeignException
)
@FeignClient(name = "client2")
public interface Client2 {...}
配置:在此处要小心,如果将@Configuration
添加到CustomFeignConfiguration
,则ClientErrorDecoder
bean将被用于每个已加载的伪装客户端< / strong>(取决于您的应用程序组件的扫描行为)
public class CustomFeignConfiguration {
@Bean
public ClientErrorDecoder clientErrorDecoder(ObjectMapper objectMapper) {
return new ClientErrorDecoder(objectMapper);
}
}
此配置也可以通过属性文件来完成。
旁注
从我的角度来看,您甚至不需要控制器建议。如果您使用Spring Web @ResponseStatus
批注,则可以告诉您应该返回哪个HTTP状态代码,并返回自定义ErrorDecoder
引发的异常正文。
有用的资源