我尝试使用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? 在这里输入代码
答案 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)
在我的情况下,我在端点的末尾省略了正斜杠,并得到了错误。将其放在我的网址末尾后,效果很好。