входящий шлюз не может отправить ответ

#spring-integration

#весенняя интеграция

Вопрос:

Приведенный ниже код использует Spring Integration 3.0.1

Интеграция XML на стороне клиента:

     <int:channel id="serviceTWeb"></int:channel>
    <int:gateway id="serviceTGW" default-request-channel="serviceTWeb"
            service-interface="com.test.ServiceTWeb">
    </int:gateway>
    <int-http:outbound-gateway
            url="http://testserver:8080/service-webapp/service"
            http-method="POST" id="RequestTNHTTP" reply-timeout="2000"
            request-channel="serviceTWeb" message-converters="conv>
    </int-http:outbound-gateway>

    <bean id="conv" class="org.springframework.integration.http.converter.SerializingHttpMessageConverter">
    </bean>
  

Интеграция на стороне веб-интерфейса XML:

     <!-- The following uses a ServiceActivator on service -->
    <bean id="stweb" class="test.poc.si.ServiceTWeb"></bean>

    <bean id="conv" class="org.springframework.integration.http.converter.SerializingHttpMessageConverter">
    </bean>

    <int:channel id="requestChannel"></int:channel>
    <int:channel id="replyChannel"></int:channel>

    <int:service-activator input-channel="requestChannel" ref="stweb"
            method="service" requires-reply="true" id="webserv"
            output-channel="replyChannel">
    </int:service-activator>
    <int-http:inbound-gateway request-channel="requestChannel"
            supported-methods="POST" path="/service" message-converters="conv"
            reply-channel="replyChannel">
            </int-http:inbound-gateway>
  

Клиент отправляет запрос на сервер, серверная сторона получает код
и обрабатывает объект запроса, но сервер выдает следующее при отправке
ответного сообщения:

СЕРЬЕЗНОЕ: Servlet.service() для сервлета [Multipart] в контексте с путем [/ service-webapp] выдал исключение [Ошибка обработки запроса; вложенным исключением является org.springframework.integration .Исключение MessagingException: не удалось преобразовать ответ: не найден подходящий HttpMessageConverter для типа [com.myobject.MReply] и принимает типы [[текст / html, изображение / gif, изображение / jpeg, /;q = .2, /; q = .2]]] с основной причиной org.springframework.integration.Исключение MessagingException: не удалось преобразовать ответ: не найден подходящий HttpMessageConverter для типа [com.myobject.MReply] и принимает типы [[текст / html, изображение / gif, изображение / jpeg, /;q = .2, /; q = .2]

Любая помощь будет приветствоваться!

Ответ №1:

Предполагая com.myobject.MReply Serializable , что это так, попробуйте настроить expected-response-type="com.myobject.MReply" исходящий шлюз. Это должно привести к тому, что заголовок accept будет установлен на application/x-java-serialized-object .

Редактировать:

Или установите expected-response-type="java.io.Serializable" , если вы не хотите привязывать его к определенному типу.

Комментарии:

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

2. Первый вариант сработал ожидаемый тип ответа =»com.myobject. MReply», но когда я попробовал заголовок accept в шлюзе, я получил следующее:

3. Первый сработал, но когда я попробовал заголовок accept, я получил: DEBUG org.springframework.beans. BeanUtils — не найден редактор свойств [com.my.ReplyEditor] для типа com.my.Reply в соответствии с соглашением о суффиксе ‘Editor’ org.springframework.beans. ConversionNotSupportedException: не удалось преобразовать значение типа ‘org.springframework.http.ResponseEntity’ в требуемый тип ‘com.my.Reply’; вложенным исключением является java.lang. Исключение IllegalStateException: не удается преобразовать значение типа [org.springframework.http.ResponseEntity] в требуемый тип [com.my.Reply]: не найдено подходящих редакторов или стратегии преобразования? Исправить?

4. Я не совсем уверен, почему это не сработало (но рассмотрю это); это подразумевает entity.hasBody() , что возвращает false (хотя ответ явно имеет тело). Однако expected-response-type="java.io.Serializable" для меня все работает нормально (и вам не нужен заголовок accept), потому что ожидаемый тип ответа Serializable установит его.

5. Оказывается, так RestTemplate работает базовая схема — если вы не даете ему an expected-response-type , вы получаете a ResponseEntity только с заголовками и кодом состояния, без тела. Извините, я ввел вас в заблуждение. Так expected-response-type что требуется совместимость с ответом content-type ; мы исправим документы. jira.spring.io/browse/INT-3452