У меня есть весенний загрузочный сервер, который связывается со службой 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;
}
}
Может кто-нибудь сказать мне, где лежит моя ошибка?