我想将我的异常从“数据库”restapi重新抛出到“后端”restapi,但我丢失了原始异常的消息。
这是我通过postman从“数据库”rest api得到的:
{
"timestamp": "2020-03-18T15:19:14.273+0000",
"status": 400,
"error": "Bad Request",
"message": "I'm DatabaseException (0)",
"path": "/database/api/vehicle/test/0"
}
这部分没问题。
这是我通过postman从“后端”rest api得到的:
{
"timestamp": "2020-03-18T15:22:12.801+0000",
"status": 400,
"error": "Bad Request",
"message": "400 BAD_REQUEST \"\"; nested exception is org.springframework.web.reactive.function.client.WebClientResponseException$BadRequest: 400 Bad Request from GET http://localhost:8090/database/api/vehicle/test/0",
"path": "/backend/api/vehicle/test/0"
}
如您所见,原来的“message”字段丢失了。
我使用:
Spring Boot2.2.5.释放
Spring启动机web
Spring启动webflux
后端和数据库从tomcat开始(web和webflux在同一个应用程序中)。
这是后端:
@GetMapping(path = "/test/{id}")
public Mono<Integer> test(@PathVariable String id) {
return vehicleService.test(id);
}
使用vehicleservice.test:
public Mono<Integer> test(String id) {
return WebClient
.create("http://localhost:8090/database/api")
.get()
.uri("/vehicle/test/{id}", id)
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(Integer.class);
}
这是数据库:
@GetMapping(path = "/test/{id}")
public Mono<Integer> test(@PathVariable String id) throws Exception {
if (id.equals("0")) {
throw new DatabaseException("I'm DatabaseException (0)");
}
return Mono.just(Integer.valueOf(2));
}
我也试过了 return Mono.error(new DatabaseException("I'm DatabaseException (0)"));
和数据库异常:
public class DatabaseException extends ResponseStatusException {
private static final long serialVersionUID = 1L;
public DatabaseException(String message) {
super(HttpStatus.BAD_REQUEST, message);
}
}
似乎我的后端转换的React,不能找到任何答案在互联网上。
2条答案
按热度按时间nzk0hqpo1#
而不是
retrieve
的WebClient
,你可以用exchange
它允许您处理错误并使用从服务响应检索的消息传播自定义异常。2ledvvac2#
下面的代码现在可以工作了,这是一个不同于我最初的问题的代码,但它的想法基本相同(使用后端restapi和数据库restapi)。
我的数据库rest api:
userrepo只是一个@restrepritory。
usermapper使用mapstruct将实体Map到dto对象。
使用:
@data&equalsandhashcode来自lombok库。
扩展responsestatusexception在这里非常重要,如果不这样做,那么响应将被错误处理。
从数据库rest api接收数据的后端rest api:
使用globalerrorhandler::
以及ExceptionResponseTo,它是从clientresponse检索某些数据所必需的:
另一个可能有用的相关类:exchangefilterfunctions.java
我在这个问题上发现了很多信息:
https://github.com/spring-projects/spring-framework/issues/20280
即使这些信息是旧的,它们仍然是相关的!