Составной запрос не работает должным образом для весенней интеграции
У меня есть две службы отдыха и слушатель
- Сервис А
- Сервис Б
- Слушатель L1
- Шаг 1 - Слушатель L1 считывает файл из локальной системы и отправляет многозначную карту в службу А. Служба 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;
}
Spring Integration 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>
Служба А:
@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;
}
Служба Б:
@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 ответ
Я думаю, что проблема в том, что после первого запроса с 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>