当前位置: 首页 > 知识库问答 >
问题:

如何在Webflux WebClient中自定义异常?

越源
2023-03-14

在我的webflux应用程序中,我想通过WebClient发送一些请求。我想处理所有条件(200、401、403和...response ),然后向客户端响应一个json。对于错误状态代码,我想使用@RestControllerAdvice,所以我必须抛出一个自定义异常,然后在控制器建议中处理自定义json。参见示例代码:

WebClient.create().post
   .uri("URI")
   .retrieve()
   .onStatus(HttpStatus::is4xxClientError, {
       // create Mono<CustomException> 
   }
   .bodyToMono(ResponseDto.class)

现在异常处理程序如下:

@ResponseBody
@ResponseStatus(...)
@ExceptionHandler(CustomException1.class)
public void customException1(CustomException1 exception) {
   //do Something width response body
}

@ExceptionHandler(CustomException2.class)
public void customException2(CustomException2 exception) {
   //do Something width response body
}

Webclient获得一个包含json主体的401响应,如下所示:

{
   "message": "Password is incorrect"
}

我可以创建<code>Mono。error(newCustomException()),但问题是WebClient响应体。如果消息是“密码不正确”,我想向客户端发送:

用户名或密码不正确

我该怎么办?

共有2个答案

葛海阳
2023-03-14

我从未使用过WebFlux,但我发现了Spring Web客户端的添加异常处理程序。看起来你可以通过编写返回Mono.error来引发异常(new CUomException1());onState处理程序函数中。根据描述,异常将从身体ToMono(类)方法引发。

最后,您可以像这样修改您的 ControllerAdvice:

@ExceptionHandler(CustomException.class)
public ResponseEntity<CustomErrorModel> customException(CustomException exception) {
   return new ResponseEntity<>( new CustomErrorModel(), HttpStatus.BAD_REQUEST );
}

正如我所说 - 我没有测试它,但它可能对你来说是一个提示。

司马念
2023-03-14

请检查以下 API 实现,该实现处理调用的 rest api 调用的错误响应。我假设我们知道 API 的响应,因此我创建了 ResponseDTO 类。

@GetMapping("/webclient/test")
public ResponseDTO testWebclient(@RequestBody RequestDTO requestPayload) {
    String url = "http://localhost:8080/api/write/simple";
    return WebClient.create()
            .post()
            .uri(url)
            .accept(MediaType.APPLICATION_JSON)
            .body(BodyInserters.fromObject(requestPayload))
            .retrieve()
            .onStatus(HttpStatus::is4xxClientError, response -> {
                return response.bodyToMono(ResponseDTO.class).flatMap(error -> {
                    return Mono.error(new CustomRuntimeException(error.getMessage(), response.statusCode(), error.getErrorCode()));
                });
            })
            .onStatus(HttpStatus::is5xxServerError, response -> {
                return response.bodyToMono(ResponseDTO.class).flatMap(error -> {
                    return Mono.error(new CustomRuntimeException(error.getMessage(), response.statusCode()));
                });
            })
            .bodyToMono(ResponseDTO.class);
}
public class ResponseDTO {

    private String message;
    private HttpStatus status;
    private ErrorCode errorCode;
    
    public ResponseDTO(String message, HttpStatus status) {
        this.message = message;
        this.status = status;
    }

    public ResponseDTO(String message, HttpStatus status, ErrorCode errorCode) {
        this.message = message;
        this.status = status;
        this.errorCode = errorCode;
    }
    /** getters **/
}
    public class ErrorCode {
        private String numCode;
        private String txtCode;
        
        /** getters **/
    }

要捕获异常,请在< code > @ RestControllerAdvice 的类中添加以下代码片段(希望您已经知道了)。

@ExceptionHandler(value = CustomRuntimeException.class)
public final ResponseEntity<ApiResponse> handleCustomRuntimeException(CustomRuntimeException exception) {
    List<ApiSubError> subErrors = Arrays.asList(new ApiSubError(exception.getMessage()));
    ApiResponse response = new ApiErrorResponse(exception.getMessage(), exception.getErrorCode());
    LOG.error("result: {}", response.getResult());
    return new ResponseEntity<>(response, exception.getHttpStatus());
}
 类似资料:
  • 主要内容:前记,1.自定义视图,2.自定义异常,3.自定义异常的原理前记 在前面的文章中, 表示了视图解析的原理和异常解析器的解析原理。 这篇通过如何自定义视图和自定义异常处理和自定义异常处理的原理进行说明。 这里说明一下, 自定义的视图和自定义的异常都是会代替容器默认的组件的, 异常还好说, 就是不符合就抛, 视图的话需要注意一下优先级, 可以在自定义的视图解析器上加上注解。 1.自定义视图 这里原理就是添加一个视图和视图解析器, 然后放入容器中, 最后访问相应

  • 问题内容: 如何在Java中创建自定义异常? 问题答案: 要定义受检查的异常,请创建的子类(或子类的层次结构)。例如: 可能引发或传播此异常的方法必须声明它: …,并且调用此方法的代码必须处理或传播此异常(或同时处理): 你会在上面的示例中注意到该错误IOException已被捕获并重新抛出为。这是用于封装异常的常用技术(通常在实现API时)。 有时在某些情况下,你不想强制每个方法在其throws

  • 我有以下try块: 我想从捕获潜在的错误。经过反复试验,我能够生成一个潜在错误列表,这些错误可以通过打印它们的类型(e)由触发。__name__值: 但是如果我尝试将我的except语句从修改为,我将得到一个错误,即未定义。 我尝试定义一个类扩展为它,大多数教程/问题在这里建议,基本上: 现在这个变量已被识别,但由于我无法控制将引发的错误,因此我无法在我的初始try块中真正引发该异常。 理想情况下

  • 问题内容: 我不确定node.js如何在异步中实现哪些功能,在异步中没有实现的功能以及如何创建自定义异步功能。 说我想创建一个自定义的异步函数。如果只是因为我对异步函数回调或cb调用了我的最后一个参数而只知道其异步函数,我会感到惊讶: 我尝试了类似的方法,但它无法异步运行。您如何告诉node.js f实际上是异步的? 问题答案: 注意 :此答案写于2014年,在出现之前,在Promises流行之前

  • 问题内容: 我正在使用Axis2 1.5.2和Eclipse。我正在使用Eclipse从生成的WSDL生成WSDL和客户端代码。 我创建了一个服务可以抛出的自定义异常。创建Web服务时一切正常。Web服务成功启动,并且可以通过指向Web浏览器来查看生成的WSDL。但是,当我告诉Eclipse使用生成的WSDL生成客户端代码时,我从Eclipse中得到了以下错误: 我的自定义异常是“ InsertU

  • 在一次采访中,我最近被问到以下问题: 有没有其他方法可以创建自定义的,而不使用: 扩展异常类或的子类,用于检查异常 为未检查的异常扩展或的子类。 可能的答案是什么?