java – 无法在spring中返回带有异常详细信息的ResponseEntity
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 无法在spring中返回带有异常详细信息的ResponseEntity,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4101字,纯文字阅读大概需要6分钟。
内容图文
![java – 无法在spring中返回带有异常详细信息的ResponseEntity](/upload/InfoBanner/zyjiaocheng/797/be3e5187a365492a8cbe07074e0a59ef.jpg)
我创建了一个Spring Restful Service和Spring MVC应用程序.
宁静的服务::
Restful服务返回一个实体,如果它存在于DB中.如果它不存在它在ResponseEntity对象中返回自定义的异常信息.
它正如预期的那样使用Postman进行测试.
@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 Service.
@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;
}
但是当我使用RestTemplate从spring MVC应用程序调用上述服务时,它返回一个有效的对象(如果存在).
如果请求的对象不存在,则Restful服务返回异常信息但未到达调用(spring MVC)应用程序.
Spring MVC应用程序使用Rest模板调用Restful Web Service
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();
解决方法:
这是预期的行为.当http状态是客户端错误或服务器错误时,Rest模板抛出异常,并在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;
}
}
自定义错误处理程序,它将错误响应映射回ResponseEntity.
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;
}
}
RestTemplate配置 – 您必须将RestTemplate的errorHandler设置为ResponseEntityErrorHandler.
@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();
}
内容总结
以上是互联网集市为您收集整理的java – 无法在spring中返回带有异常详细信息的ResponseEntity全部内容,希望文章能够帮你解决java – 无法在spring中返回带有异常详细信息的ResponseEntity所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。