составной запрос не работает должным образом для весенней интеграции - PullRequest
0 голосов
/ 03 октября 2018

У меня есть две службы отдыха и слушатель

  1. Служба A
  2. Служба B
  3. Слушатель L1

  • Шаг 1 - Слушатель L1 читает файл из локальной сети и отправляет многозначную карту вслужба A. Служба A получает некоторый документ из базы данных и возвращает его в виде байтов в слушатель L1.
    Шаг 2 - слушатель L1 затем отправляет другую многозначную карту в службу B и сохраняет документ.

Шаг 1 работает должным образом, используя MultiValueMap, где, как и при попытке отправить байты документа в Службу B, используя ту же процедуру. Во время шага 2 - я получаю Не удалось записать запрос: не найден подходящий HttpMessageConverter для типа запроса[org.springframework.util.LinkedMultiValueMap] и тип содержимого [application / octet-stream] .Я выполняю ту же процедуру, но все еще получаю проблему.

Пожалуйста, найдите ниже примеры кода и дайте мне знать, как решить эту проблему.

Listener1.java

public Message<?> processJMSReqMsqAndSendToRest1(String message) throws Exception {
        MultiValueMap<String, Object> mainMap = new LinkedMultiValueMap<String, Object>();
        Map<String, String> secondaryMap = new HashMap<String, String>();
        secondaryMap.put("key1", "value1");
        secondaryMap.put("key2", "value2");
        secondaryMap.put("key3", "value3");
        byte[] messageBytes = message.getBytes();
        File newFile = new File("D:\\Temp\\temp.jpg");
        InputStream is = new FileInputStream(newFile);
        byte[] fileBytes = IOUtils.toByteArray(is);
        is.close();
        mainMap.add("metaData", secondaryMap);
        mainMap.add("messageBytes", messageBytes );
        Message<?> message1 = MessageBuilder.withPayload(mainMap).build();
        return message1;
    }


public Message<?> processRest1AndSendToRest2(Message<?> obj)  throws Exception{
    byte[] docBytes = (byte[])obj.getPayload();
    MultiValueMap<String, Object> mainMap = new LinkedMultiValueMap<String, Object>();
    Map<String, String> secondaryMap = new HashMap<String, String>();
    secondaryMap.put("key1", "value1");
    secondaryMap.put("key2", "value2");
    secondaryMap.put("key3", "value3");
    mainMap.add("metaData", secondaryMap);
    mainMap.add("messageBytes", docBytes);
    Message<?> message1 = MessageBuilder.withPayload(mainMap).build();
    return message1;

}

Интеграция пружин xml

<int-http:outbound-gateway
        id="docServiceOutBoundGateway" request-channel="docMetaDataIn"
        http-method="POST" url="http://localhost:8030/getDocument"
        expected-response-type="[B" reply-channel="sourceDocumentOutLv1">
    </int-http:outbound-gateway>

    <int:service-activator
        input-channel="sourceDocumentOutLv1"
        ref="docConversionOrchestratorImpl" method="processRest1AndSendToRest2"
        output-channel="sourceDocumentOutLv2" />

    <int-http:outbound-gateway  request-channel="sourceDocumentOutLv2"
            http-method="POST" url="http://localhost:8030/sendDocument"
            encode-uri="false"
            expected-response-type="java.lang.String" reply-channel="processedDocOutLv1">

    </int-http:outbound-gateway>

Сервис A:

@RequestMapping(value = "/getDocument", method = RequestMethod.POST)
    @ResponseBody
    public byte[] testRest1(@RequestPart("metaData")Map<String,String> metaData,@RequestPart("messageBytes")byte[] messageBytes) {
byte[] r2  = //get doc from database as bytes
        return r2;
    }

Служба B:

@RequestMapping(value = "/sendDocument", method = RequestMethod.POST)
    @ResponseBody
    public String tesMySql1(@RequestPart("metaData")Map<String,String> metaData,@RequestPart("messageBytes")byte[] messageBytes) {

            return  "working";
    }

Я пытался отправить его напрямую через шаблон отдыха через Java, который работает нормально.Но я хочу, чтобы структура была последовательной и делалась через весеннюю интеграцию xml.Я использую весеннюю загрузку 2.0.2 BOM.

1 Ответ

0 голосов
/ 03 октября 2018

Я думаю, что проблема в том, что после первого запроса с expected-response-type="[B" вы получаете заголовок contetType как application/octet-stream, и это не подходит для второго запроса, где у вас есть MultiValueMap, но неу меня нет никаких крючков, как это представить.

Я предлагаю вам добавить header-enricher перед отправкой второго запроса:

<int:service-activator
        input-channel="sourceDocumentOutLv1"
        ref="docConversionOrchestratorImpl" method="processRest1AndSendToRest2"
        output-channel="enrichContentTypeHeaderChannel" />

<int:header-enricher input-channel="enrichContentTypeHeaderChannel" output-channel="sourceDocumentOutLv2">
    <int:header name="contentType" value="multipart/form-data" overwrite="true"/>
</int:header-enricher>
...