Ответ 1
CXF 2.7.4
В CXF WSDL генерируется через Interceptor в цепочке, называемой WSDLGetInterceptor
, которая помещается в цепочку READ
.
Основной дизайн
- проверьте, является ли вызов HTTP GET
- подготовить выходное сообщение для возврата
- доступ к wsdl (из Java или из статического источника)
- записать wsdl в выходное сообщение
- прервать цепочку перехватчиков, чтобы обеспечить выходное сообщение
Самый простой способ действовать в этом процессе - упредить этот перехватчик от выполнения своей работы, либо зарегистрировав свою собственную реализацию раньше.
Удаление стандартных перехватчиков CXF - это "трудная задача" на шине по умолчанию (самый простой способ - зарегистрировать свой собственный перехватчик, перенести его первым в цепочку и сделать так, чтобы он удалял другие перехватчики таким образом message.getInterceptorChain().remove(removeInterceptor);
Но добавление ваших собственных непосредственно перед тем, как стандартный перехватчик WSDL прост:
public MyWSDLGetInterceptor() {
super(Phase.READ);
addBefore(WSDLGetInterceptor.class.getName());
}
MyWSDLGetInterceptor
будет расширять стандартный WSDLGetInterceptor
, и вы только переопределяете:
public Document getDocument(Message message,
String base,
Map<String, String> params,
String ctxUri,
EndpointInfo endpointInfo) {
Document domDocument = super.getDocument(message, base, params, ctxUri, endpointInfo);
domDocument.getChildNodes(); // Whatever you need to add remove
return domDocument; // Once modified
}
Вы можете изменить полученный DOM-документ на лету (добавить/создать узлы DOM) или через XSLT, что вам больше подходит, вы вернетесь к стандартному XML-стандарту через стандартный API.
CXF 2.7.x(где x находится где-то > 4 и < 10)
Принцип тот же, но перехватчик работает по-разному.
- Он (в частном методе) помещает WSDL в качестве документа DOM как свойство исходящего сообщения
- Он очищает цепочку выходных перехватчиков всех перехватчиков (за исключением абсолютной необходимости)
- Он регистрирует
WSDLGetOutInterceptor
в цепочке вывода - Он останавливает цепочку IN и переходит к цепочке останова
-
WSDLGetOutInterceptor
выполняет сериализацию
Так что это немного сложнее/менее чисто. Но используя тот же принцип предотвращения базового перехватчика (зарегистрировавшись непосредственно перед этим), вы можете переопределить cleanUpOutInteceptors
, чтобы манипулировать сообщением, как и в случае 2.7.4, путем доступа к WSDL через outMessage.get(DOCUMENT_HOLDER)
WADL
Извините, у меня нет опыта, но я думаю, что CXF имеет такую же архитектуру для обоих...