【问题标题】:HttpClientErrorException: 404 nullHttpClientErrorException: 404 空
【发布时间】:2017-09-12 00:12:20
【问题描述】:

我尝试使用 RestTemplate 调用控制器中的地址,结果我想获得 OK 或 NOT FOUND 状态 我在这个控制器中这样做

@GetMapping(value = "/thanks")
public ModelAndView confirmAccount(
        @RequestParam String token,
        UriComponentsBuilder uriComponentsBuilder
) {
    RestTemplate restTemplate = new RestTemplate();
    HttpEntity<Object> entity = new HttpEntity<>(new HttpHeaders());

    UriComponents uriComponents
            = uriComponentsBuilder.path("/register/token/{token}").buildAndExpand(token);

    ResponseEntity<Boolean> response = restTemplate
            .exchange(uriComponents.toUri(),
                      HttpMethod.PUT,
                      entity,
                      Boolean.class);

    return response.getStatusCode().toString().equals("200")
            ?  new ModelAndView("redirect:/signIn") : new ModelAndView("tokenNotFound");
}

我称之为控制器的这个地址。

@RequestMapping(value = "/register/token/{token}", method = RequestMethod.PUT)
public
HttpEntity<Boolean> confirmAccount(
        @PathVariable String token
) {
    Optional<User> userOptional = userService.findByActivationToken(token);

    if(userOptional.isPresent()) {
        User user = userOptional.get();

        user.setActivationToken(null);
        user.setEnabled(true);

        userService.saveUser(user);
    } else {
        return ResponseEntity.notFound().build();
    }

    return ResponseEntity.ok(true);
}

结果她把我扔到了控制台

org.springframework.web.client.HttpClientErrorException: 404 null
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:63) ~[spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700) ~[spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653) ~[spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:628) ~[spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:549) ~[spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE]
at com.service.app.controller.RegisterController.confirmAccount(RegisterController.java:40) ~[classes/:na]

为什么 RestTemplate 不希望返回状态 404 作为结果? 在此输入代码

【问题讨论】:

  • 你调用什么 url 来测试流程?
  • 对不起。我将整个控制器映射到'/register'。这里我更正了地址。
  • HttpClientErrorException 异常何时发生,同时调用“/thanks”或“/register/token”?更多堆栈跟踪可能会有用
  • 首先你需要检查你是否正确调用/register/token/{token}?如果它实际上是在 confirmAccount 方法中,您可以通过放置日志语句的断点来检查。如果它没有命中这个方法,那么问题在于调用这个方法,它也会抛出 404 但它会被 Spring 抛出。

标签: java spring rest spring-mvc spring-boot


【解决方案1】:

我为这个异常做了很多努力,即使 URL 是绝对正确的,并且相对 URL 也适用于 POST 请求。 404 表示由于查询参数或请求参数或路径参数,在 RestTemplate 或 HttpRequest 中为 GET 类型方法指定的 URL 不正确。原因查询/路径参数的值包含转换或解释不同的特殊字符。 假设 queryParams 是 email=test@xyz.com 转换为 email=test20%xyz41%.com

解决方案:在传递查询/路径参数时解码。

在服务器端添加以下代码 [控制器代码]

服务器端[控制器]:

import java.net.URLDecoder;
 import java.net.URLEncoder;

String encodedEmail = URLDecoder.decode(email, "UTF-8");

它完美运行并经过测试的代码。

【讨论】:

  • 这个醒了我
【解决方案2】:

简单的解释可以是 HttpClientErrorException 是未经检查的异常。此异常的 Java 文档告诉“收到 HTTP 4xx 时抛出异常” 参考 - https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/HttpClientErrorException.html

所以尝试使用适当的 try/catch 和 throws 处理异常

【讨论】:

【解决方案3】:

就我而言,我在端点末尾遗漏了一个正斜杠并得到了错误。将它放在我的网址末尾后,它工作正常。

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    相关资源
    最近更新 更多