HttpClientErrorException:404 null

时间:2017-09-12 00:12:21

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

我尝试使用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?     在这里输入代码

3 个答案:

答案 0 :(得分:1)

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

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

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

ServerSide [Controller]:

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

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

这是完美的工作和经过测试的代码。

答案 1 :(得分:0)

一个简单的解释可以是HttpClientErrorException是未经检查的异常。此异常的Java文档告诉我们,当收到HTTP 4xx时会抛出异常&#39; 参考 - https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/HttpClientErrorException.html

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

答案 2 :(得分:0)

在我的情况下,我在端点的末尾省略了正斜杠,并得到了错误。将其放在我的网址末尾后,效果很好。