Вот что у меня сработало. По сути, это применение идеи, высказанной @Joseph Rajeev Motha (хотя я нашел ее в другом месте, здесь: https://dwuysan.wordpress.com/2012/04/02/jax-ws-wsimport-and-the-error-mustunderstand-headers-not-understood/#comment-215), но его ответ не дает пример, и без него ответ довольно загадочный.
Обратите внимание, что эта последовательность применяется к отдельному случаю (где вы публикуете Endpoint
самостоятельно).
Шаг 1
Создайте SOAPHandler
, который будет «понимать» заголовок:
public class WSSESecurityUnderstandPretender implements SOAPHandler<SOAPMessageContext> {
@Override
public Set<QName> getHeaders() {
final QName securityHeader = new QName(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Security",
"wsse");
final Set<QName> headers = new HashSet<>();
headers.add(securityHeader);
// notify the runtime that this is handled
return headers;
}
@Override
public boolean handleMessage(SOAPMessageContext context) {
// we must return true, or else the runtime will return
// wrong wrapper element name (like makeTransfer instead of
// makeTransferResponse)
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
// we must return true, or else the runtime will return
// wrong wrapper element name (like makeTransfer instead of
// makeTransferResponse)
return true;
}
@Override
public void close(MessageContext context) {
}
}
Шаг 2
Создайте файл handler-chain.xml
и поместите его в classpath:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<javaee:handler-chains
xmlns:javaee="http://java.sun.com/xml/ns/javaee"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<javaee:handler-chain>
<javaee:handler>
<javaee:handler-class>com.mypackage.WSSESecurityUnderstandPretender</javaee:handler-class>
</javaee:handler>
</javaee:handler-chain>
</javaee:handler-chains>
Шаг 3
Аннотируйте ваш класс реализации (класс, помеченный @WebService
) со ссылкой на файл цепочки обработчика:
@HandlerChain(file = "handler-chain.xml")
Шаг 4
Опубликуйте свою конечную точку:
Endpoint endpoint = Endpoint.publish(url, impl);
Важное примечание
handleMessage()
и handleFault()
, определенные обработчиком, должны возвращать true
. В противном случае вы получите странные ошибки, такие как «Неожиданный элемент оболочки», поскольку будет использоваться другое имя элемента оболочки.