9.5响应处理

分类: Spring Cloud OpenFeign

响应处理

正确处理响应是 Feign 客户端的重要功能。本节将学习响应处理。

本节将学习:响应对象映射、错误处理、响应拦截器,以及自定义解码器。

响应对象映射

基础映射

@GetMapping("/api/users/{id}") User getUser(@PathVariable Long id);

集合映射

@GetMapping("/api/users") List<User> getUsers();

泛型映射

@GetMapping("/api/users") ResponseEntity<List<User>> getUsers();

自定义响应

@GetMapping("/api/users") ApiResponse<List<User>> getUsers(); public class ApiResponse<T> { private Integer code; private String message; private T data; // getters and setters }

错误处理

默认错误处理

@FeignClient(name = "user-service") public interface UserServiceClient { @GetMapping("/api/users/{id}") User getUser(@PathVariable Long id); }

自定义错误解码器

public class CustomErrorDecoder implements ErrorDecoder { @Override public Exception decode(String methodKey, Response response) { if (response.status() == 404) { return new UserNotFoundException("User not found"); } if (response.status() == 500) { return new ServerException("Server error"); } return new RuntimeException("Unknown error"); } }

配置错误解码器

@Configuration public class FeignConfig { @Bean public ErrorDecoder errorDecoder() { return new CustomErrorDecoder(); } }

降级处理

@FeignClient(name = "user-service", fallback = UserServiceFallback.class) public interface UserServiceClient { @GetMapping("/api/users/{id}") User getUser(@PathVariable Long id); } @Component public class UserServiceFallback implements UserServiceClient { @Override public User getUser(Long id) { return new User(); // 返回默认值 } }

响应拦截器

实现拦截器

public class ResponseInterceptor implements ResponseInterceptor { @Override public Object aroundDecode(InvocationHandler handler, Method method, Response response) throws Throwable { // 响应处理逻辑 return handler.invoke(method, response); } }

配置拦截器

@Configuration public class FeignConfig { @Bean public ResponseInterceptor responseInterceptor() { return new ResponseInterceptor(); } }

日志拦截器

public class LoggingResponseInterceptor implements ResponseInterceptor { private static final Logger log = LoggerFactory.getLogger(LoggingResponseInterceptor.class); @Override public Object aroundDecode(InvocationHandler handler, Method method, Response response) throws Throwable { log.info("Response status: {}, method: {}", response.status(), method.getName()); return handler.invoke(method, response); } }

自定义解码器

实现解码器

public class CustomDecoder implements Decoder { private final ObjectMapper objectMapper; public CustomDecoder() { this.objectMapper = new ObjectMapper(); } @Override public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException { if (response.body() == null) { return null; } String body = Util.toString(response.body().asReader(StandardCharsets.UTF_8)); return objectMapper.readValue(body, objectMapper.constructType(type)); } }

配置解码器

@Configuration public class FeignConfig { @Bean public Decoder decoder() { return new CustomDecoder(); } }

条件解码

public class ConditionalDecoder implements Decoder { @Override public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException { String contentType = response.headers().get("Content-Type").iterator().next(); if (contentType.contains("application/json")) { // JSON 解码 } else if (contentType.contains("application/xml")) { // XML 解码 } return null; } }

完整示例

综合配置

@Configuration public class FeignConfig { @Bean public ErrorDecoder errorDecoder() { return new CustomErrorDecoder(); } @Bean public ResponseInterceptor responseInterceptor() { return new LoggingResponseInterceptor(); } @Bean public Decoder decoder() { return new CustomDecoder(); } }

官方资源

本节小结

在本节中,我们学习了:

第一个是响应对象映射。 如何映射响应对象。

第二个是错误处理。 如何处理错误和异常。

第三个是响应拦截器。 如何使用响应拦截器。

第四个是自定义解码器。 如何实现自定义解码器。

这就是响应处理。正确处理响应可以提高系统的健壮性。

在下一节,我们将学习 Feign 与 LoadBalancer 集成。