Может ли код состояния ответа HTTPS стать доступным в других классах в интеграции Spring - PullRequest
0 голосов
/ 14 июля 2020

У меня есть требование сделать response.statusCode (), полученный от ClientHttpResponse в Interceptor, должен быть доступен в созданном мной объекте testSubmitPaymentResponseVO, чтобы обработка ошибок могла выполняться соответствующим образом. Однако я не знаю, где и как передать ответ на мой POJO testSubmitPaymentResponseVO.

<int:channel id="MytestReqRequestChannel"/>

<int:header-enricher input-channel="MytestReqRequestChannel" output-channel="MytestReqEnrichedRequestChannel">
    <int:header name="x-api-key" value="#{configurationService.configuration.getProperty('myKey')}"/>
    <int:header name="Content-Type" value="application/json;charset=UTF-8" />
</int:header-enricher>


<int:object-to-json-transformer input-channel="MytestReqEnrichedRequestChannel"
                                output-channel="MytestReqJSONRequestChannel"/>

<int-http:outbound-gateway
        url="#{configurationService.configuration.getProperty('myURL')}"
        http-method="POST"
        header-mapper="testPaymentHeaderMapper"
        rest-template="testSubmitPaymentRestTemplate"
        request-channel="MytestReqJSONRequestChannel"
        reply-channel="MytestReqJSONResponseChannel"
        charset="UTF-8"
        expected-response-type="java.lang.String">
</int-http:outbound-gateway>

<int:json-to-object-transformer input-channel="MytestReqJSONResponseChannel"
                                output-channel="MytestReqResponseChannel"
                                type="com.test.testb2bintegrations.models.payment.request.testSubmitPaymentResponseVO"/>

<int:channel id="MytestReqResponseChannel"/>

Код перехватчика:

public class TestRequestLoggingInterceptor implements ClientHttpRequestInterceptor
{

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException
{
    ClientHttpResponse response;
    try
    {
        request.getHeaders().setAcceptCharset(Collections.singletonList(Charsets.UTF_8));
        long startTimeinMillis = new Date().getTime();
        response = execution.execute(request, body);
        logResponse(response);
    }
    catch (Exception e)
    {
        LOGGER.error("Error when trying to fetch the information : " + e.getMessage());
        throw new IOException("Connection was unsuccessful!", e);
    }
    return response;
}

private void logResponse(ClientHttpResponse response) throws IOException
{
       String lineSeparator = System.lineSeparator();
        String responseBody = StreamUtils.copyToString(response.getBody(), Charset.forName("UTF-8"));

        StringBuilder responseLog = new StringBuilder();
        responseLog.append("=======================Response Begin==========================").append(lineSeparator);
        responseLog.append("Status code  : {" + response.getStatusCode() + "}").append(lineSeparator);
        responseLog.append("Status text  : {" + response.getStatusText() + "}").append(lineSeparator);
        responseLog.append("Headers      : {" + response.getHeaders() + "}").append(lineSeparator);
        responseLog.append("Response body: {" + responseBody + "}").append(lineSeparator);
        responseLog.append("======================Response End==============================").append(lineSeparator);
}

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Я дал вам несколько инструкций в комментариях к моему ответу на ваш вопрос: java .lang.IllegalArgumentException: аргумент 'json' должен быть экземпляром: [class java .lang.String, class [B

Мы, вероятно, могли бы рассматривать это как дублирование, но это не повредит мне, если я повторюсь и здесь.

Код состояния HTTP-ответа сохраняется в соответствующем заголовке, когда <int-http:outbound-gateway> обрабатывает ClientHttpResponse:

    else {
        replyBuilder = messageBuilderFactory.withPayload(httpResponse);
    }
    replyBuilder.setHeader(org.springframework.integration.http.HttpHeaders.STATUS_CODE,
            httpResponse.getStatusCode());
    return replyBuilder.copyHeaders(headers);

И этот заголовок просто доступен ниже по потоку для вашего рассмотрения.

Если вы действительно хотите, чтобы этот код состояния был представлен в вашем testSubmitPaymentResponseVO, тогда вам, вероятно, понадобится установить на нем.

Один из способов - реализовать некоторый метод преобразования, чтобы принять ваш testSubmitPaymentResponseVO и этот заголовок и установить его в свой POJO и вернуть это из этого заголовка:

testSubmitPaymentResponseVO setStatusCode(testSubmitPaymentResponseVO pojo, @Header(name = HttpHeaders.STATUS_CODE) HttpStatus statusCode) {
   pojo.setStatusCode(statusCode);
   return pojo;
}

Другой способ - использовать компонент <enricher>:

<int:enricher id="userEnricher"
              input-channel="setStatusCodeChannel"
              output-channel="MytestReqResponseChannel">
    <int:property name="StatusCode" expression="headers[http_statusCode]"/>
</int:enricher>

И ваш <int:json-to-object-transformer> должен выводить в этот новый setStatusCodeChannel.

См. Документы: https://docs.spring.io/spring-integration/docs/current/reference/html/message-transformation.html#payload -en богаче

0 голосов
/ 14 июля 2020

Непонятно о чем вы; если код состояния отличается от 200, обычно у вас не будет строки JSON для преобразования в POJO.

Вы можете добавить ExpressionEvaluatingRequestHandlerAdvice к шлюзу и обработать исключение, и создайте там соответствующую строку JSON. См. добавление поведения к конечным точкам ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...