Что я хочу сделать, так это написать кусок кода (часть более крупного веб-приложения, развернутого на glassfish), который подключается к другой системе через веб-сервис. Однако я пишу только клиент, поэтому я предполагаю, что я не могу изменить WSDL или изменить что-либо на стороне сервера (включая auth, это, вероятно, проблема здесь). Я новичок в веб-сервисах, так что, пожалуйста, пишите ваши ответы как можно проще.
Мне удалось сгенерировать классы из WSDL, написать простое приложение командной строки, которое подключается к веб-сервису, добавляет заголовок безопасности (добавьте незашифрованное имя пользователя / пароль, подробнее ниже), вызывает некоторый метод и печатает результат. Все работает нормально в командной строке, но если я присоединю этот код к «большему веб-приложению» (развернуть на glassfish), я получу следующую ошибку:
SP0105: В wsdl должно присутствовать утверждение SymmetricBinding / AsymmetricBinding / TransportBinding.
Я не получаю его оттуда - если он работает из командной строки (за пределами Glassfish), зачем ему нужно что-то еще при развертывании на Glassfish?
Я использовал подсказки с этой страницы:
http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client
Чтобы дать больше информации об этом, некоторые фрагменты кода:
Фрагмент кода для разрешения конечной точки и вызывающей службы (в файле EndpointResolver.java):
URL baseUrl = EndpointResolver.class.getResource(".");
url = new URL(baseUrl, "WSDL_file.xml");
QName qname = new QName(SomeConfig.NAMESPACE, SomeConfig.LOCAL_PART);
Service service = Service.create(url, qname);
service.setHandlerResolver(headerHandlerResolver);
endpoint = service.getPort(MyPortType.class);
endpoint.doSomething();
//printing results here ..
HeaderHandlerResolver (реализующий javax.xml.ws.handler.HandlerResolver) наиболее важный метид:
public List<Handler> getHandlerChain(PortInfo portInfo) {
List<Handler> handlerChain = new ArrayList<Handler>();
handlerChain.add(headerHandler); //injected to HeaderHandlerResolver
return handlerChain;
}
Метод дескриптора HeaderHandler (аутентификация здесь :))
public boolean handleMessage(SOAPMessageContext smc) {
Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if ( outboundProperty.booleanValue() ) {
SOAPMessage message = smc.getMessage();
try {
SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
SOAPHeader header = envelope.addHeader();
SOAPElement security = header.addChildElement("Security", "wsse",
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse");
usernameToken.addAttribute(new QName("xmlns:wsu"), "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
SOAPElement username = usernameToken.addChildElement("Username", "wsse");
username.addTextNode("myUsername");
SOAPElement password = usernameToken.addChildElement("Password", "wsse");
password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
password.addTextNode("myPassword");
} catch (SOAPException e) {
log.warn(e.getMessage());
e.printStackTrace();
}
} else {
try {
//This handler does nothing with the response from the Web Service so
//we just print out the SOAP message.
logSOAPMessage(smc.getMessage());
} catch (Exception ex) {
log.warn(ex.getMessage());
ex.printStackTrace();
}
}
return outboundProperty;
}
@Override
public Set<QName> getHeaders() {
return null;
}
(...)
Большое спасибо за любую помощь в этом.
редактирование:
Ниже приведена часть 'policy' из файла wsdl (как указано выше, я не могу это изменить):
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken">
<wsp:ExactlyOne>
<wsp:All>
<sp:SupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"/>
</wsp:Policy>
</sp:SupportingTokens>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>