В службе Apache CXF JAX-RS отсутствует запуск XML-документа

Я разрабатываю веб-сервисы, используя Apache CXF и Spring. Мои интерфейсы и конфигурация настроены так, что у меня есть как службы REST, так и службы SOAP. Apache CXF не запускает XML-документ: <?xml version="1.0" encoding="UTF-8"?>

Для службы SOAP я реализовал перехватчик, и он отлично работает. Вот код:

public class CustomHeaderInterceptor extends AbstractPhaseInterceptor<Message> {

public CustomHeaderInterceptor() {
    super(Phase.PRE_STREAM);
    addBefore(StaxOutInterceptor.class.getName());
}

@Override
public void handleMessage(Message message) throws Fault {
    message.put(Message.ENCODING, "UTF-8");
    message.put(StaxOutInterceptor.FORCE_START_DOCUMENT, Boolean.TRUE);
}
}

Перехватчик добавляется со следующей конфигурацией:

<bean id="customHeader" class="com.minervanetworks.xtv.stb.utils.CustomHeaderInterceptor" />

<cxf:bus>
    <cxf:inInterceptors>
        <ref bean="logInbound" />
    </cxf:inInterceptors>
    <cxf:outInterceptors>
        <ref bean="customHeader" />
        <ref bean="logOutbound" />
    </cxf:outInterceptors>
    <cxf:inFaultInterceptors>
        <ref bean="logInbound" />
    </cxf:inFaultInterceptors>
    <cxf:outFaultInterceptors>
        <ref bean="logOutbound" />
    </cxf:outFaultInterceptors>
</cxf:bus>

К сожалению, это не работает для моего сервера JAX-RS. «StaxOutInterceptor.FORCE_START_DOCUMENT» обрабатывается StaxOutInterceptor и не находится в цепочке, когда я использую JAX-RS. Его нельзя добавить вручную, так как он зависит от StaxOutEndingInterceptor, который находится в завершающей фазе и вызывается после JAXRSOutInterceptor.

Я также пытался реализовать обработчик для той же цели, но безуспешно.

Вот конфигурация моего сервера JAXRS:

<jaxrs:server id="restServer" address="/rest">
    <jaxrs:providers>
        <ref bean="systemExceptionMapper" />
        <ref bean="jaxbProvider" />
    </jaxrs:providers>
    <jaxrs:serviceBeans>
        ...
    </jaxrs:serviceBeans>
    <jaxrs:extensionMappings>
        <entry key="json" value="application/json" />
        <entry key="xml" value="application/xml" />
        <entry key="feed" value="application/atom+xml" />
        <entry key="html" value="text/html" />
    </jaxrs:extensionMappings>
</jaxrs:server>

Любая помощь - идеи, предложения, все, что будет оценено!


person nb.alexiev    schedule 19.10.2011    source источник


Ответы (1)


Потратив много времени на эту проблему, я нашел следующее решение.

Apache CXF не запускает XML Document Start при маршалинге коллекций, как это было в моем случае. Это своего рода упущение в провайдере JAXBElement. Я понял, что при маршалинге отдельных объектов все просто отлично.

Поэтому очевидным решением для меня было обернуть мою коллекцию в объект коллекции, например:

общедоступный класс CollectionWrapper {

коллекция частных списков;

...

}

Рефакторинг моих методов для возврата CollectionWrapper, а не List, сделал свое дело.

person nb.alexiev    schedule 26.10.2011
comment
+1 за то, что поделились своим решением с сообществом. Вы также должны отметить свой вопрос как ответ. - person sra; 26.10.2011