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

Rest模板结果在spring boot中的api调用中变为null

郭华美
2023-03-14

我正在使用以下代码调用远程API以删除用户id(http://localhost:8080/remove).

try {
final RestTemplate restTemplate = new RestTemplate();
    final UriComponentsBuilder builder = 
UriComponentsBuilder.fromUriString(url);
    builder.queryParam("acdc_id", acdcId);
ResponseEntity<ServiceResponse> result =
            restTemplate.exchange(
                builder.toUriString(),
                HttpMethod.DELETE,
                null,
                ServiceResponse.class);
}catch(Exception e){
//exception handling
}

远程API为成功流返回200个http代码(工作正常),但当某些用户id不可用时,API将发送以下自定义响应:

{
"error code": "404",
"error": "USER ID Node not found : xyz"
} 

我已经ServiceResponse.java类以获得上述响应,但在这种情况下,Rest Temboard返回以下错误。

org.springframework.web.client.HttpClientErrorException$NotFound: 404 null
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:85)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122)
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:778)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:736)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:670)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:579) 

我的服务响应类是,

@JsonIgnoreProperties(ignoreUnknown = true)
public class ServiceResponse {

@JsonProperty(value = "error code")
private String errorCode;

@JsonProperty(value = "error")
private String error;

/**
 * @return the error.
 */
public String getError() {
    return error;
}

/**
 * @param error The error to set.
 */
public void setError(final String error) {
    this.error = error;
}

/**
 * @return the errorCode.
 */
public String getErrorCode() {
    return errorCode;
}

/**
 * @param errorCode The errorCode to set.
 */
public void setErrorCode(final String errorCode) {
    this.errorCode = errorCode;
}

}

请您在这里帮助我解决我的问题,或提供任何建议,如何从API获得正确的响应而不是空错误

共有2个答案

商华藏
2023-03-14

您可以使用控制器建议(ControllerAdvice)注释来处理异常。您可以从该方法发送自定义响应。您可以为HttpClientErrorException定义exceptionHandler,并从此方法发送自定义响应。

请检查https://www.tutorialspoint.com/spring_boot/spring_boot_exception_handling.htm了解更多详细信息。

还有一个选择是您可以使用CustomACK seErrorHandler,如下所示

@Component
public class RestTemplateResponseErrorHandler 
  implements ResponseErrorHandler {

    @Override
    public boolean hasError(ClientHttpResponse httpResponse) 
      throws IOException {

        return (
          httpResponse.getStatusCode().series() == CLIENT_ERROR 
          || httpResponse.getStatusCode().series() == SERVER_ERROR);
    }

    @Override
    public void handleError(ClientHttpResponse httpResponse) 
      throws IOException {

        if (httpResponse.getStatusCode()
          .series() == HttpStatus.Series.SERVER_ERROR) {
            // handle SERVER_ERROR
        } else if (httpResponse.getStatusCode()
          .series() == HttpStatus.Series.CLIENT_ERROR) {
            // handle CLIENT_ERROR
            if (httpResponse.getStatusCode() == HttpStatus.NOT_FOUND) {
                throw new NotFoundException();
            }
        }
    }
}

然后用它就像

@Bean
    RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler());

        return restTemplate;
    }

请检查https://www.baeldung.com/spring-rest-template-error-handling的响应ErrorHandler

莫承运
2023-03-14

正如我在评论中提到的,您将得到HttpClientErrorException,应该捕获并处理它。您正在捕获整个Exception类,但其中没有代码。或者您也可以同时使用@ControllerAdvice和@ExceptionHandler来实现这一点。

 类似资料:
  • 我对@Async和Rest模板调用有问题;下面是我的主要应用程序类,带有一个任务执行器Bean和EnableAsync注释 这是我在Rest控制器中调用的带有异步注释的my测试服务: 此服务在rest模板上返回一个nullPointer;这是stacktrace 但是如果我删除@enableAsync和@Async,那么简单的Rest模板可以很好地工作。 当我传递HttpServlet请求时,Ec

  • 问题内容: 我们的客户给了我一个REST API,我需要对其进行PHP调用。但是,事实上,API提供的文档非常有限,因此我真的不知道如何调用该服务。 我已经尝试过使用Google,但是唯一出现的是已经过期的Yahoo!。有关如何调用服务的教程。没有提及标题或任何深度信息。 是否有关于如何调用REST API的任何体面的信息,或有关它的一些文档?因为即使在W3schools上,它们也仅描述SOAP方

  • 我正在尝试使用Swift对REST API进行GET调用,并尝试了许多教程,但都无法找到答案。要么是因为我不知道如何将所有的Obj-C翻译成Swift,要么是因为有一半的方法n'such被弃用了。有人知道如何调用并解析返回的JSON数据吗?

  • 本文向大家介绍SpringBoot中的Thymeleaf模板,包括了SpringBoot中的Thymeleaf模板的使用技巧和注意事项,需要的朋友参考一下 一、前言     Thymeleaf 的出现是为了取代 JSP,虽然 JSP 存在了很长时间,并在 Java Web 开发中无处不在,但是它也存在一些缺陷: 1、JSP 最明显的问题在于它看起来像HTML或XML,但它其实上并不是。大多数的JS

  • 我有一个rest api: ..... 和serv.prop(请求): 在catch内部,我只想在这个api rest中截获错误类型(400404500502 ecc ecc),并调用记录此错误的外部服务。 谢谢你的帮助

  • null 错误: 现在,这意味着它正在尝试创建新的而不是更新现有的 然后,我用