我有基于Spring MVC的网站,用于验证我需要调用第三方API(与我们的核心用户数据库通信所有应用程序)的用户,并在那里验证用户。 我能够成功地做到这一点,只有当ThirdParty API由于某种原因而关闭时,我的网站也会在任何访问者尝试登录或注册时发生轰炸。
我正在调用这样的远程API:
ResponseEntity<LoginApiResponse> responseEntity = restTemplate.exchange(uri, HttpMethod.POST, request, LoginApiResponse.class);
这里,LoginApiResponse.class是一个bean,它包含UserDetails和其中可能包含的响应的其他信息。
Bean粗略地看起来像这样:
public class LoginApiResponse {
private HttpStatus status;
private String message;
private String responseStatus;
private UserModel userModel;
... ...
}
我有一个CustomRestResponseErrorHandler来处理我网站上的错误。
但是,当第三方站点关闭时,维护页面将配置为针对任何类型的请求返回,因此我获得的响应将为text/html
类型,响应状态为200 OK
。因此,这里没有遇到任何例外,我的CustomRestResponseErrorHandler
没有发挥作用。相反,当代码无法根据调用将text/html
类型响应转换为LoginApiResponse
时,代码会发生爆炸。它抛出,
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class org.habba.web.rest.registration.LoginApiResponse] and content type [text/html]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:811)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:795)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:574)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:547)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:468)
如何避免这种情况发生并提前确定ThirdPartyApi不可用?
答案 0 :(得分:0)
根据您的说法,您从API获得的正常回复的内容类型似乎是application/json
。您可以使用ResponseEntity<LoginApiResponse>
而不是使用ResponseEntity<Object>
,并使用responseEntity.getHeaders().getContentType()
检查内容类型。如果内容类型不符合您的预期,您可以采取相应的措施。