从泽西客户端迁移到RestTemplate,但它捕获401错误作为httpclienterroreexception,但



在我的服务中有Jersey客户端实现来调用rest API,现在我正在将此代码迁移到RestTemplate。在旧代码中,当后台响应出现401错误时,我将响应存储在对象中。

但是当我将代码迁移到RestTeplate时,401被httpclienterroreexception类捕获,因此我无法获得响应,因为代码流进入catch块。

Jersey客户端代码

public Employees getEmployees1() throws MyException {
Employee employee=new Employee(23, "Test", "Test", "Test@test.com");

ClientResponse response=null;
try {
Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/employees/");
response = webResource.accept("application/json")
.type("application/json").header("Authorization", "invalid Data").post(ClientResponse.class, employee);
}catch (RuntimeException e) {
logger.error("Runtime Error Occured -{} Response - {} ",e.getMessage(),response.getStatus());
throw new MyException("Unexpected Error Occured",e);
}catch (Exception e) {
logger.error("Some Error Occured -{} Response - {} ",e.getMessage(),response.getStatus());
throw new MyException("Unexpected Error Occured",e);
}
return response.readEntity(Employees.class);
}
<<p>创建RestTemplate代码/strong>
public Employees getEmployees() throws MyException {
Employee employee=new Employee(23, "Test", "Test", "Test@test.com");
HttpHeaders headers=new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.add(HttpHeaders.AUTHORIZATION, "invalid Data");
ResponseEntity<Employees> response=null;
try {
response = this.restTemplate.exchange("http://localhost:8080/employees/", HttpMethod.POST, new HttpEntity<Employee>(employee,headers), Employees.class);
}catch (RuntimeException e) {
logger.error("Runtime Error Occured -{} Response - {} ",e.getMessage(),response.getStatusCode());
throw new MyException("Unexpected Error Occured",e);
}catch (Exception e) {
logger.error("Some Error Occured -{} Response - {} ",e.getMessage(),response.getStatusCode());
throw new MyException("Unexpected Error Occured",e);
}
return response.getBody();
}

默认情况下,RestTemplate为所有400多个状态码抛出一个HttpStatusCodeException(它的子代码)-参见DefaultResponseErrorHandler。您可以通过使用setErrorHandler将您自己的ResponseErrorHandler实现设置为RestTemplate,或者如果RestTemplate使用RestTemplateBuilder构建-使用构建器的errorHandler方法来更改此行为。

我使用默认的ResponseErrorHandler,通过使用它将绕过所有的ResponseError异常

RestTemplate rt =  restTemplateBuilder.errorHandler(new ResponseErrorHandler(){
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return false;
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
}})
.build();

最新更新