Я вызываю внешний сервер, используя HttpRequestExecutingMessageHandler. Я использую преобразователь JSON в объект для преобразования данных JSON. Но я получаю следующее исключение.
Вызвано: com.fasterxml.jackson.core.JsonParseException: недопустимый символ ((CTRL-CHAR, код 31)): допускается только обычный пробел (\r, \n, \t) между токенами в [Источник: (String )�
когда я проверил заголовки, я нашел следующее. Transfer-Encoding=chunked
Является ли это причиной журнала исключений?
Исходящий шлюз и JsonToObjectTransformer приведены ниже:
@ServiceActivator(inputChannel = "channelOutboundRequest")
@Bean
public HttpRequestExecutingMessageHandler outboundGateway() {
final HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler(
endpoint);
handler.setExpectedResponseType(String.class);
handler.setHttpMethod(HttpMethod.POST);
handler.setOutputChannelName("channelResponse");
handler.setAdviceChain(Collections.singletonList(advice()));
return handler;
}
@Bean
@Transformer(inputChannel = "channelResponse", outputChannel = "channelReply")
public JsonToObjectTransformer transformer(ObjectMapper objectMapper) {
final JsonObjectMapper<?, ?> mapper = new Jackson2JsonObjectMapper(objectMapper);
return new JsonToObjectTransformer(DetailsDTO.class, mapper);
}
Если заголовок вызывает проблему, как я могу обработать ответ?
Примечание. Если я попаду на внешний сервер напрямую с помощью почтальона, я получу ответ в формате JSON.
Я понятия не имею, что здесь не так. Если я использую простой вызов retemplate, как показано ниже, он работает правильно.
JSONObject jsonObject = new JSONObject("{\"code\":\"F001\",\"transactionId\":\"1008566223232\"}");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth("token");
HttpEntity<String> request =
new HttpEntity<String>(jsonObject.toString(), headers);
String respns = restTemplt.postForObject("http://endpoint", request, String.class);
System.out.println(respns);
JSONObject response = new JSONObject(respns);
Одно отличие, которое я смог найти, было в заголовках ответов. они приведены ниже:
Заголовки ответа исходящего шлюза: – {Transfer-Encoding=chunked, http_requestMethod=GET, errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@d8b195e, Server=nginx , Accept=/, Connection=keep-alive, User-Agent=PostmanRuntime/7.28.0, Host=localhost:8901, Accept-Encoding=gzip, deflate, br . -Encoding=gzip, http_requestUrl=http://inboundurl, id=be07fc8d-d478-5fa9-33e4-61a2b5f92468, Content-Length=207, contentType=application/json;charset=utf-8, Content-Type=application/json , запрос от = CUSTOM_HEADER, отметка времени = 1622533092827}
Обычный заголовок ответа на вызов restTemplate [Server:nginx, Date:Tue, 01 Jun 2021 07:34:54 GMT, Content-Type:application/json; charset = utf-8, Content-Length: 4105, Connection: keep-alive, Access-Control-Allow-Origin: *, Content-Security-Policy: default-src 'self'; base-uri 'self'; block- все-смешанный-контент; font-src 'self' https: data:;frame-предки 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src -attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests, X-DNS-Prefetch-Control:off, Expect-CT:max-age=0, X-Frame- Опции: SAMEORIGIN, Strict-Transport-Security: max-age=15552000; includeSubDomains, X-Download-Options: noopen, X-Content-Type-Options: nosniff, X-Permitted-Cross-Domain-Policies: none, Referrer-Policy: no-referrer, X-XSS-Protection: 0, ETag: W/1009-llD9DqxYkEsjyikWajYk+16cb1k]
Кто-нибудь может помочь?