春季远程身份验证时如何处理停机情况?

时间:2017-03-24 10:40:50

标签: java spring spring-mvc authentication

我有基于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不可用?

1 个答案:

答案 0 :(得分:0)

根据您的说法,您从API获得的正常回复的内容类型似乎是application/json。您可以使用ResponseEntity<LoginApiResponse>而不是使用ResponseEntity<Object>,并使用responseEntity.getHeaders().getContentType()检查内容类型。如果内容类型不符合您的预期,您可以采取相应的措施。