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

在spring中无法返回带有异常详细信息的ResponseEntity

程瑞
2023-03-14

Restful Service::Restful Service返回一个实体,如果该实体存在于数据库中。如果它不存在,则在ResponseEntity对象中返回自定义异常信息。

它是预期的工作测试使用邮递员。

@GetMapping(value = "/validate/{itemId}", produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
public ResponseEntity<MyItem> validateItem(@PathVariable Long itemId, @RequestHeader HttpHeaders httpHeaders) {

    MyItem myItem = myitemService.validateMyItem(itemId);
    ResponseEntity<MyItem> responseEntity = null;
    if (myItem == null) {
        throw new ItemNotFoundException("Item Not Found!!!!");
    }
    responseEntity = new ResponseEntity<MyItem>(myItem, headers, HttpStatus.OK);
    return responseEntity;
}

如果请求的实体不存在,Restful服务将返回下面的内容。

@ExceptionHandler(ItemNotFoundException.class)
public ResponseEntity<ExceptionResponse> itemNotFEx(WebRequest webRequest, Exception exception) {
    System.out.println("In CREEH::ItemNFE");
    ExceptionResponse exceptionResponse = new ExceptionResponse("Item Not Found Ex!!!", new Date(), webRequest.getDescription(false));
    ResponseEntity<ExceptionResponse> responseEntity = new ResponseEntity<ExceptionResponse>(exceptionResponse, HttpStatus.NOT_FOUND);
    return responseEntity;
}
String url = "http://localhost:8080/ItemServices/items/validate/{itemId}";
ResponseEntity<Object> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, Object.class, uriParms);
int restCallStateCode = responseEntity.getStatusCodeValue();

共有1个答案

桑鸿志
2023-03-14

这是预期的行为。Rest模板在http状态为客户端错误或服务器错误时抛出异常,并在http状态为非错误状态时返回响应。

您必须提供使用错误处理程序的实现,将响应映射到响应实体并抛出异常。

使用ResponseEntity字段创建新的错误异常类。

public class ResponseEntityErrorException extends RuntimeException {
  private ResponseEntity<ErrorResponse> errorResponse;
  public ResponseEntityErrorException(ResponseEntity<ErrorResponse> errorResponse) {
      this.errorResponse = errorResponse;
  }
  public ResponseEntity<ErrorResponse> getErrorResponse() {
      return errorResponse;
  }
}
public class ResponseEntityErrorHandler implements ResponseErrorHandler {

  private List<HttpMessageConverter<?>> messageConverters;

  @Override
  public boolean hasError(ClientHttpResponse response) throws IOException {
    return hasError(response.getStatusCode());
  }

  protected boolean hasError(HttpStatus statusCode) {
    return (statusCode.is4xxClientError() || statusCode.is5xxServerError());
  }

  @Override
  public void handleError(ClientHttpResponse response) throws IOException {
    HttpMessageConverterExtractor<ExceptionResponse> errorMessageExtractor =
      new HttpMessageConverterExtractor(ExceptionResponse.class, messageConverters);
    ExceptionResponse errorObject = errorMessageExtractor.extractData(response);
    throw new ResponseEntityErrorException(ResponseEntity.status(response.getRawStatusCode()).headers(response.getHeaders()).body(errorObject));
  }

  public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
    this.messageConverters = messageConverters;
  }
}
@Configuration
public class RestTemplateConfiguration {
  @Bean
  public RestTemplate restTemplate() {
      RestTemplate restTemplate = new RestTemplate();
      ResponseEntityErrorHandler errorHandler = new ResponseEntityErrorHandler();
      errorHandler.setMessageConverters(restTemplate.getMessageConverters());
      restTemplate.setErrorHandler(errorHandler); 
      return restTemplate;
   }
}
@Autowired restTemplate

String url = "http://localhost:8080/ItemServices/items/validate/{itemId}";
try {
    ResponseEntity<Object> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, Object.class, uriParms);
    int restCallStateCode = responseEntity.getStatusCodeValue();
} catch (ResponseEntityErrorException re) {
    ResponseEntity<ErrorResponse> errorResponse = re.getErrorResponse();
}
 类似资料:
  • 问题内容: 我想获取Python3中Exception的详细信息 例如…在foo.py中 和标准输出是… 我想从实例“ err”中获得有关此内置异常类的更多信息, 如 文件:foo.py 行:4 讯息:“ dict”对象没有属性“ encode” 就像这段代码的标准输出 这个 问题答案: 使用该模块可打印当前位置或给定异常的回溯。 您没有说明期望的输出,但是无论哪种模块,该模块很可能都能产生最适合

  • 问题内容: 我正在尝试使用数据库表在Spring应用程序中应用安全性。 到目前为止,我的applicationContext-Security中有: 我对userDetailsS​​ervice的实现如下所示: 我的汇编程序如下所示: 现在,用户实体为: 我的userentitydao界面是: 实现是: 现在,当我尝试在tomcat上进行部署时,出现以下异常: 而不管我该怎么办,我不知道这是怎么回

  • 我试图在Typescript中设置一个节点gRPC服务器,我已经让一切正常,但处理请求/响应的冗长让我感觉不好。我遵循了https://github.com/blokur/grpc-ts-demo这似乎是许多示例项目的设置方式。 处理请求或响应时会出现问题,而创建的代码生成工具()存根要求您处理如下请求和响应: 从为生成的类型为: 因此,如果消息有一堆字段,或者如果您必须编写一堆RPC处理程序,那

  • 通过方法,我可以获取异常的详细消息,我只需要一些细节,比如该异常的会话信息:、Session id:、.。 注: 具体地说,我使用

  • 我觉得需要获取任何具有“record”返回数据类型的函数返回的表的列名和数据类型,因为。。。 现有基于SQL Server的系统中的一个关键进程使用一个存储过程,该存储过程将用户定义的函数作为参数。初始步骤获取作为参数传递的函数返回的表的列名和类型。 在Postgres 13中,我可以使用pg_proc.prorettype和相应的pg_type来查找返回记录类型的函数...这是一个开始。我也可以