Spring Integration HttpRequestExecutingMessageHandler ContentType Проблема - PullRequest
0 голосов
/ 19 сентября 2019

У меня проблема с Spring Integration.Я пытаюсь выполнить вызов покоя через HttpRequestExecutingMessageHandler.Моя конечная точка отдыха принимает только тип контента 'application / json'.

Проблема в том, что HttpRequestExecutingMessageHandler публикует сообщения с типом контента 'text / plain; charset = UTF-8'.

@ServiceActivator(inputChannel = "transformRequestToJsonChannel", 
   outputChannel = "httpRequestOutChannel")
public Message<?> transformRequest(Message<DocumentConverterRequest> 
   message) 
{
  LOG.info("transforming document converter request to json: '{}'",         
  ObjectToJsonTransformer transformer = new ObjectToJsonTransformer();
  transformer.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
  Object payload = transformer.transform(message).getPayload();
  LOG.info("payload: '{}'", payload.toString());
  return MessageBuilder.withPayload(payload).build();
}

@Bean
@ServiceActivator(inputChannel = "httpRequestOutChannel")
public HttpRequestExecutingMessageHandler outbound() {
  HttpRequestExecutingMessageHandler handler = new 
  HttpRequestExecutingMessageHandler(documentConverterRestUrl);
  handler.setHttpMethod(HttpMethod.POST);
  handler.setErrorHandler(httpResponseErrorHandler);
  handler.setExpectedResponseType(String.class);
  handler.setCharset(Charset.defaultCharset().name());
  HeaderMapper<HttpHeaders> mapper = new DefaultHttpHeaderMapper();
  HttpHeaders httpHeaders = new HttpHeaders();
  httpHeaders.add(HttpHeaders.CONTENT_TYPE, 
    MediaType.APPLICATION_JSON_VALUE);
  mapper.toHeaders(httpHeaders);
  handler.setHeaderMapper(mapper);
  handler.setOutputChannel(httpResponseChannel());
  return handler;
}

Как мне переопределить тип контента?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019
@Bean
@ServiceActivator(inputChannel = "httpRequestOutChannel")
public HttpRequestExecutingMessageHandler outbound() {
  HttpRequestExecutingMessageHandler handler = Http.outboundGateway(documentConverterRestUrl)
        .httpMethod(HttpMethod.POST)
        .messageConverters(new MappingJackson2HttpMessageConverter())
        .mappedRequestHeaders("Content-Type")
        .get();

        handler.setOutputChannel(httpResponseChannel());
        return handler;
}

Я удалил свой ObjectToJsonTransformer, потому что messageConverters(new MappingJackson2HttpMessageConverter()) делает вещи.

Также мне пришлось добавить content-type в заголовок моего сообщения: .setHeaderIfAbsent(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)

0 голосов
/ 19 сентября 2019

Этот фрагмент кода ничего не делает:

  HeaderMapper<HttpHeaders> mapper = new DefaultHttpHeaderMapper();
  HttpHeaders httpHeaders = new HttpHeaders();
  httpHeaders.add(HttpHeaders.CONTENT_TYPE, 
    MediaType.APPLICATION_JSON_VALUE);
  mapper.toHeaders(httpHeaders);

То, что toHeaders() вызывается из HttpRequestExecutingMessageHandler, когда мы получаем ответ.Это действительно бесполезно использовать в явном виде в вашем коде, особенно на этапе определения бина и когда вы игнорируете результат.

Вам вообще не нужно использовать явный HeaderMapper: значение по умолчанию должно бытьдостаточно для вас.

ObjectToJsonTransformer действительно отображает, что setContentType(), в заголовки сообщения, на которое он отвечает:

if (headers.containsKey(MessageHeaders.CONTENT_TYPE)) {
        // override, unless empty
        if (this.contentTypeExplicitlySet && StringUtils.hasLength(this.contentType)) {
            headers.put(MessageHeaders.CONTENT_TYPE, this.contentType);
        }
}
else if (StringUtils.hasLength(this.contentType)) {
        headers.put(MessageHeaders.CONTENT_TYPE, this.contentType);
}

Итак, существует соответствующий тип контента для сопоставления.По умолчанию HttpRequestExecutingMessageHandler использует:

/**
 * Factory method for creating a basic outbound mapper instance.
 * This will map all standard HTTP request headers when sending an HTTP request,
 * and it will map all standard HTTP response headers when receiving an HTTP response.
 * @return The default outbound mapper.
 */
public static DefaultHttpHeaderMapper outboundMapper() {

С соответствующим набором заголовков для сопоставления с HTTP-запросом и HTTP-ответом.

new DefaultHttpHeaderMapper() приносит только пустой набор заголовков дляmap.

Пожалуйста, поднимите вопрос, чтобы улучшить JavaDocs и Справочное руководство, чтобы заметить, что ctor по умолчанию этого класса не приносит никаких заголовков на карту.

...