Отключить FastInfoset (принудительно XML) на Apache CXF при использовании клиента

Мне нужно заставить Apache CXF отправлять запросы XML и обрабатывать только ответы XML, когда я являюсь клиентом, и у меня нет контроля над сервером или конфигурацией (я видел это, но это относится только к серверу). Прямо сейчас он всегда использует FastInfoset, который отлично подходит для выступлений, но вызывает некоторые проблемы, и я хотел бы иметь возможность отключить его, но я не нашел много информации о FastInfoset в Интернете и о том, как его отключить. У тебя есть какие-нибудь подсказки?

Спасибо заранее за любую помощь.

1 ответ

Это возможно только в том случае, если удаленный сервер поддерживает чисто XML-ответы. Большинство серверов, которые поддерживают как Fastinfoset, так и чистый XML, изучают Accept Заголовок из запроса, чтобы решить, в каком формате вернуть ответ. Таким образом, вы можете попытаться форсировать ответ XML, отправив Accept: application/xml Заголовок с каждым из ваших запросов. Для этого вам нужно создать перехватчик CXF out и зарегистрировать его в вашем приложении.

Следующий перехватчик всегда будет установлен Accept: application/xml

public class HttpHeaderInterceptor extends AbstractPhaseInterceptor<Message>{
    public XmlOnlyInterceptor() {
        super(Phase.POST_PROTOCOL);
    }
    @Override
    public void handleMessage(Message message) throws Fault {
        Map<String, List> headers = (Map<String, List>)message.get(Message.PROTOCOL_HEADERS);
        headers.put("Accept", Collections.singletonList("application/xml"));
    }
}

Для регистрации используйте следующую конфигурацию

<jaxws:client id="clientBean" serviceClass="org.example.service.ServicePortType"
          address="example.org/src/service/ServicePort">
    <jaxws:outInterceptors>
        <bean class="org.example.interceptor.HttpHeaderInterceptor"/>
    </jaxws:outInterceptors>
</jaxws:client>
Другие вопросы по тегам