
本教程详细讲解如何将spring webclient在处理http错误时返回的字符串格式响应体转换为自定义java pojo对象。通过创建匹配错误结构体的pojo类,并利用webclient的错误处理机制结合json转换器,实现对错误信息的结构化解析,提升错误处理的便捷性和可读性。
在使用Spring WebClient进行HTTP请求时,处理正常响应体通常很简单,但当远程服务返回HTTP错误状态码(如4xx或5xx)时,WebClient默认会将错误响应体作为字符串处理,或者直接抛出WebClientResponseException。为了更有效地解析和利用这些错误信息,将其转换为结构化的Java POJO对象是最佳实践。这不仅提高了代码的可读性,也方便了后续的业务逻辑处理。
WebClient提供了灵活的错误处理API,主要通过onStatus和onErrorResume等方法。
关键在于,当错误发生时,如何从ClientResponse中提取并转换响应体。
首先,我们需要根据远程服务可能返回的错误响应JSON结构,定义一个对应的Java POJO(Plain Old Java Object)类。例如,如果错误响应体是:
{
    "timestamp": "2023-10-27T10:00:00.000+00:00",
    "status": 400,
    "error": "Bad Request",
    "message": "Invalid input parameters provided.",
    "path": "/api/resource"
}那么,对应的Java POJO可以定义如下:
import java.time.LocalDateTime;
public class ErrorResponse {
    private LocalDateTime timestamp;
    private int status;
    private String error;
    private String message;
    private String path;
    // 必须包含无参构造函数
    public ErrorResponse() {}
    // 包含所有字段的构造函数(可选,但推荐)
    public ErrorResponse(LocalDateTime timestamp, int status, String error, String message, String path) {
        this.timestamp = timestamp;
        this.status = status;
        this.error = error;
        this.message = message;
        this.path = path;
    }
    // Getter和Setter方法
    public LocalDateTime getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(LocalDateTime timestamp) {
        this.timestamp = timestamp;
    }
    public int getStatus() {
        return status;
    }
    public void setStatus(int status) {
        this.status = status;
    }
    public String getError() {
        return error;
    }
    public void setError(String error) {
        this.error = error;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public String getPath() {
        return path;
    }
    public void setPath(String path) {
        this.path = path;
    }
    @Override
    public String toString() {
        return "ErrorResponse{" +
               "timestamp=" + timestamp +
               ", status=" + status +
               ", error='" + error + '\'' +
               ", message='" + message + '\'' +
               ", path='" + path + '\'' +
               '}';
    }
}注意事项:
在WebClient调用中,我们可以结合onStatus方法和bodyToMono来将错误响应体转换为POJO。
import org.springframework.http.HttpStatus;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClientResponseException;
import reactor.core.publisher.Mono;
public class WebClientErrorConverter {
    private final WebClient webClient;
    public WebClientErrorConverter(WebClient webClient) {
        this.webClient = webClient;
    }
    public Mono<String> callRemoteService() {
        return webClient.get()
                .uri("/api/resource") // 假设这个URI会返回错误
                .retrieve()
                // 使用onStatus处理非2xx状态码
                .onStatus(HttpStatus::is4xxClientError, clientResponse ->
                    clientResponse.bodyToMono(ErrorResponse.class) // 将错误响应体转换为ErrorResponse POJO
                                  .flatMap(errorBody -> {
                                      // 这里可以根据errorBody的内容抛出自定义异常
                                      System.err.println("Client Error: " + errorBody.getMessage());
                                      return Mono.error(new CustomServiceException(
                                          "Client error from remote service: " + errorBody.getMessage(),
                                          errorBody.getStatus(),
                                          errorBody.getError()
                                      ));
                                  })
                )
                .onStatus(HttpStatus::is5xxServerError, clientResponse ->
                    clientResponse.bodyToMono(ErrorResponse.class) // 同样处理5xx错误
                                  .flatMap(errorBody -> {
                                      System.err.println("Server Error: " + errorBody.getMessage());
                                      return Mono.error(new CustomServiceException(
                                          "Server error from remote service: " + errorBody.getMessage(),
                                          errorBody.getStatus(),
                                          errorBody.getError()
                                      ));
                                  })
                )
                .bodyToMono(String.class) // 正常响应体预期为String
                .onErrorResume(CustomServiceException.class, ex -> {
                    // 在这里处理自定义异常,例如记录日志或返回默认值
                    System.err.println("Caught custom service exception: " + ex.getMessage());
                    return Mono.just("Fallback response due to service error.");
                })
                .onErrorResume(WebClientResponseException.class, ex -> {
                    // 处理未能转换为POJO的WebClientResponseException
                    System.err.println("Caught generic WebClientResponseException: " + ex.getStatusCode() + " - " + ex.getResponseBodyAsString());
                    return Mono.just("Fallback response due to generic WebClient error.");
                })
                .onErrorResume(Throwable.class, ex -> {
                    // 捕获其他所有异常
                    System.err.println("Caught unexpected exception: " + ex.getMessage());
                    return Mono.just("Fallback response due to unexpected error.");
                });
    }
    // 示例自定义异常类
    public static class CustomServiceException extends RuntimeException {
        private final int statusCode;
        private final String errorType;
        public CustomServiceException(String message, int statusCode, String errorType) {
            super(message);
            this.statusCode = statusCode;
            this.errorType = errorType;
        }
        public int getStatusCode() {
            return statusCode;
        }
        public String getErrorType() {
            return errorType;
        }
    }
    public static void main(String[] args) {
        // 示例WebClient配置
        WebClient webClient = WebClient.builder()
                .baseUrl("http://localhost:8080") // 替换为你的服务地址
                .build();
        WebClientErrorConverter converter = new WebClientErrorConverter(webClient);
        converter.callRemoteService().subscribe(
                success -> System.out.println("Success: " + success),
                error -> System.err.println("Error during subscription: " + error.getMessage())
        );
    }
}在上述代码中:
Spring Boot默认集成了Jackson作为JSON处理器。当你将Jackson或Gson库添加到项目中时,Spring Boot会自动配置相应的HttpMessageReader,使得bodyToMono(YourPojo.class)能够自动进行JSON到POJO的转换。无需手动调用ObjectMapper或Gson实例,WebClient会为你处理这些细节。
通过以上步骤,我们能够将Spring WebClient在遇到HTTP错误时返回的字符串响应体,有效地转换为结构化的Java POJO对象。这种方法极大地提升了错误处理的灵活性和代码的可维护性,使得开发者可以基于具体的错误信息进行更精细的业务逻辑判断和用户反馈。关键在于正确定义与错误JSON结构匹配的POJO类,并利用WebClient的onStatus结合bodyToMono方法进行转换。
以上就是Spring WebClient错误响应体转换为POJO对象教程的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号