Как выполнить POST с типом XML и получить ответ как java.lang.String в верблюде?

Я пытаюсь сделать небольшой транслятор сообщений для ввода нового типа данных в существующую систему. Для этого я перевожу новый XML во внутренний класс, выполняю операцию и результат, который хочу вернуть в виде строки. Когда я развертываю ответ в виде XML, проблем не возникает, но в настоящее время я получаю следующую ошибку:

java.io.IOException: org.apache.camel.InvalidPayloadException: No body available of type: javax.xml.bind.JAXBElement but has value: 00 of type: java.lang.String on: Message: 00. Exchange[ID-60345-1455623194156-43-5][Message: 00]

Я попытался заменить тип производит, outType, настроить заголовки с установкой Content-Type на text/plain, но это не помогает. Исходный BindingMode был XML. Моя цель - вернуть простую строку с помощью метода POST.

<restConfiguration component="netty4-http" 
                  bindingMode="auto" 
                  contextPath="/WebServices/rest"
                  enableCORS="true">
   <endpointProperty key="nettySharedHttpServer" value="#sharedNettyHttpServer"/> 
   <dataFormatProperty key="prettyPrint" value="false"/>
</restConfiguration>

<!-- defines the rest services using the context-path /user -->
<rest path="/service" 
     consumes="application/xml" 
     produces="text/plain">
   <description>REST service</description>

   <post uri="/request" 
         type="org.company.generated.VmML" 
         outType="java.lang.String">

       <route>
            <to uri="bean:authenticationBean?method=checkAuthentication"/>
            <bean ref="messageTranslator" method="vmmlToEntry"/>
            <to uri="bean:Service?method=store"/>
            <bean ref="messageTranslator" method="returnEntryToStringReplay"/>
       </route>
   </post>           
</rest>

person h__    schedule 16.02.2016    source источник
comment
Это работает, если вы установите bindingMode="off"? Тогда вам придется самостоятельно выполнить демаршалирование JAXB, но ничто не должно мешать вам возвращать простую строку, если это то, что вы хотите сделать.   -  person Ralf    schedule 16.02.2016
comment
Режим выключения не пробовал. Я пробовал xml, xml_json, авто. Наконец я удалил это свойство, и оно начало работать. Я не знаю, почему он переопределяет мои настройки для определения одиночного отдыха.   -  person h__    schedule 17.02.2016


Ответы (1)


Мне не удалось заставить мой пример работать с bindingMode="auto", поэтому я не могу проверить, действительно ли это проблема, но это работает для меня:

<camelContext id="rest-test" allowUseOriginalMessage="false" xmlns="http://camel.apache.org/schema/blueprint" streamCache="false">
    <dataFormats>
        <jaxb id="jaxb" prettyPrint="false" contextPath="my.domain.classes" />
    </dataFormats>

    <restConfiguration component="jetty" scheme="http" host="0.0.0.0" port="9001" contextPath="/string/conversion" bindingMode="off" />

    <rest path="/test" id="rest-string-conversion" produces="text/plain" consumes="application/xml">
        <post>
            <route>
                <camel:unmarshal ref="jaxb"/>
                <camel:transform>
                    <camel:simple>${body.eventId}</camel:simple>
                </camel:transform>
                <log message="Event ID: ${body}" loggingLevel="INFO" logName="string-conversion-test" />
            </route>
        </post>
    </rest>
</camelContext>

Ответ представляет собой строку, содержащую только идентификатор события, который я извлек из объекта Event, который я получаю в маршруте. Однако заголовок Content-Type ответа ошибочно установлен в application/xml вместо text/plain:

200 OK
Content-Type:  application/xml
[..]
Transfer-Encoding:  chunked
Server:  Jetty(9.2.10.v20150310)

d9870180-257a-11e5-b345-feff819cdc9f

Возможно, ваш ответ действительно содержит строку, но вашего клиента смущает заголовок Content-Type?

person Ralf    schedule 16.02.2016
comment
У меня тип ответа в моем REST-клиенте всегда обычный/текстовый - person h__; 17.02.2016