具有自定义ErrorHandler的OAuth2RestTemplate

时间:2017-08-28 17:04:56

标签: spring spring-security spring-security-oauth2

我已经使用自定义错误处理程序配置了OAuth2RestTemplate,如果状态为4xx或5xx(我想检查ResponseEntity本身的HttpStatus),我想要禁用抛出异常的默认行为。

实现看起来像这样

@Bean
public OAuth2RestTemplate restTemplate(OAuth2ProtectedResourceDetails resourceDetails) {
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails);
    restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
        @Override
        public void handleError(ClientHttpResponse response) throws IOException {
            // nothing to do
        }
    });
    return restTemplate;
}

当请求导致状态409(冲突)时,我总是得到以下异常:

  

org.springframework.web.client.ResourceAccessException:I / O错误   " http://localhost:10010/ ...":流的POST请求已关闭;   嵌套异常是java.io.IOException:stream已关闭

有没有办法避免这种异常?如果我删除自定义错误处理程序,则会出现HttpClientErrorException

  

org.springframework.web.client.HttpClientErrorException:409 Conflict

感谢您的回复:)

致以最诚挚的问候,

哈德

1 个答案:

答案 0 :(得分:2)

我已经能够通过创建OAuth2ErrorHandler的自定义子类并使用它而不是自定义的ResponseErrorHandler来解决抛出的异常。 OAuth2RestTemplate显式检查errorHandlers是否为OAuth2ErrorHandler的实例。

您只需要覆盖hasError方法:

 
public class NoOpResponseErrorHandler extends OAuth2ErrorHandler {
    NoOpResponseErrorHandler(OAuth2ProtectedResourceDetails resource) {
        super(resource);
    }
    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        return response.getStatusCode().equals(HttpStatus.UNAUTHORIZED) ||
                response.getStatusCode().equals(HttpStatus.FORBIDDEN);
    }
}

要与OAuth2RestTemplate一起使用,您需要传递OAuth2ProtectedResourceDetails对象(即ClientCredentialsResourceDetails)。

OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails);
restTemplate.setErrorHandler(new NoOpOAuthErrorHandler(resourceDetails));

请参阅https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/client/OAuth2RestTemplate.java#L91