Spring Boot со сжатием OAuth2RestTemplate и GZIP - PullRequest
0 голосов
/ 12 июня 2019

У меня есть весенний загрузочный сервер, который связывается со службой REST. Этот сервис защищен Keycloak. Ответ службы REST сжимается gzip. Теперь я получаю следующую ошибку для запроса:

com.fasterxml.jackson.core.JsonParseException: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens

Очевидно, что Spring Boot не распаковывает тело отклика.

Вот что я сделал:

  • Включить сжатие в application.yml
  • Добавить CompressionClientHttpRequestInterceptor
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import java.io.IOException;

public class CompressionClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        request.getHeaders().add(HttpHeaders.ACCEPT_ENCODING, "gzip");
        return execution.execute(request, body);
    }
}
  • Добавить KeycloakClientCredentialsConfig
@Service
public class KeycloakClientCredentialsConfig {

    @Bean
    public KeycloakClientCredentialsRestTemplate createRestTemplate() {
        KeycloakClientCredentialsRestTemplate restTemplate = new KeycloakClientCredentialsRestTemplate(getClientCredentialsResourceDetails(), new DefaultOAuth2ClientContext());

        // interceptors
        List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
        if (CollectionUtils.isEmpty(interceptors)) interceptors = new ArrayList<>();
        // add compression interceptor
        interceptors.add(new CompressionClientHttpRequestInterceptor());
        restTemplate.setInterceptors(interceptors);

        return restTemplate;
    }

    private ClientCredentialsResourceDetails getClientCredentialsResourceDetails() {
       ...
    }
}
  • Добавить KeycloakClientCredentialsRestTemplate
import org.springframework.security.oauth2.client.OAuth2ClientContext;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails;

public class KeycloakClientCredentialsRestTemplate extends OAuth2RestTemplate {

    public KeycloakClientCredentialsRestTemplate(OAuth2ProtectedResourceDetails resource,
                                                 OAuth2ClientContext context) {
        super(resource, context);
    }
}

Наконец, я получаю данные через Spring Boot Service с KeycloakClientCredentialsRestTemplate.

@Service
@Log4j2
public class QualityCheckGroupService {

    @Value("${rest.url}")
    private String url;

    private KeycloakClientCredentialsRestTemplate clientRestTemplate;

    @Autowired
    public QualityCheckGroupService(KeycloakClientCredentialsRestTemplate clientRestTemplate) {
        this.clientRestTemplate = clientRestTemplate;
    }

    public QualityCheckGroupWrapper getQualityCheckGroupWrapper(int id, String toolId) {
        ResponseEntity<QualityCheckGroupWrapper> responseEntity =
                clientRestTemplate.getForEntity(String.format("%s/qualityCheckSummaries/%d/%s", url, id, toolId), QualityCheckGroupWrapper.class);
        QualityCheckGroupWrapper qualityCheckGroupWrapper = responseEntity.getBody();
        if (qualityCheckGroupWrapper != null) this.setCachedQualityCheckGroupDate(id, toolId);
        return qualityCheckGroupWrapper;
    }
}

Может кто-нибудь сказать мне, где лежит моя ошибка?

...