WebExceptionHandler:如何用Spring Webflow编写正文

sy5wg1nm  于 2022-09-18  发布在  Spring
关注(0)|答案(2)|浏览(156)

我想通过添加WebExceptionHandler来处理API的异常。我可以更改状态代码,但当我想要更改响应的正文时,我就卡住了:例如,添加异常消息或自定义对象。

有没有人举个例子?

如何添加我的WebExceptionHandler:

HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(toHttpHandler(routerFunction))
  .prependExceptionHandler((serverWebExchange, exception) -> {

      exchange.getResponse().setStatusCode(myStatusGivenTheException);
      exchange.getResponse().writeAndFlushWith(??)
      return Mono.empty();

  }).build();
lymnna71

lymnna711#

WebExceptionHandler级别相当低,因此您必须直接处理请求/响应交换。

请注意:

  • Mono<Void>返回类型应该发出响应处理结束的信号;这就是为什么它应该连接到写入响应的Publisher
  • 在这个级别,您直接处理数据缓冲区(没有可用的序列化支持)

您的WebExceptionHandler可能如下所示:

(serverWebExchange, exception) -> {

  exchange.getResponse().setStatusCode(myStatusGivenTheException);
  byte[] bytes = "Some text".getBytes(StandardCharsets.UTF_8);
  DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
  return exchange.getResponse().writeWith(Flux.just(buffer));
}
lrl1mhuk

lrl1mhuk2#

给出了答案,为了序列化对象,我使用以下方式:

Mono<DataBuffer> db = commonsException.getErrorsResponse().map(errorsResponse -> {

     ObjectMapper objectMapper = new ObjectMapper();
     try {
         return objectMapper.writeValueAsBytes(errorsResponse);
     } catch (JsonProcessingException e) {
          return e.getMessage().getBytes();
     }
}).map(s -> exchange.getResponse().bufferFactory().wrap(s));

exchange.getResponse().getHeaders().add("Content-Type", "application/json");
exchange.getResponse().setStatusCode(commonsException.getHttpStatus());
return exchange.getResponse().writeWith(db);

相关问题