gpt4 book ai didi

Java/JAX-WS : Calling webservice works locally, 在 glassfish 上失败。身份验证问题 (SP0105)

转载 作者:行者123 更新时间:2023-12-04 06:14:50 24 4
gpt4 key购买 nike

我想要做的是编写一段代码(部署在 glassfish 上的更大网络应用程序的一部分),通过网络服务连接到其他系统。但是我只写客户端,所以我假设我不能更改 WSDL 或修改服务器端的任何内容(包括身份验证,这可能是这里的问题)。我是网络服务的新手,所以请尽可能简单地写下你的答案。

我能够从 WSDL 生成类,编写连接到 Web 服务的简单命令行应用程序,添加安全 header (添加纯文本用户名/密码,更多内容如下),调用一些方法并打印结果。在命令行上一切正常,但如果我将此代码附加到“更大的 webapp”(部署在 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)最重要的methid:
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;
}
(...)

非常感谢您对此提供的任何帮助。

编辑:
以下是 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>

最佳答案

我将回答我自己的问题:

解决上述问题需要做两件事。需要做的第一件事是更新 glassfish 上的 Metro 库(我已将其更新到 2.1.1 版,因此更新了库 lib/webservices-rt.jar、lib/webservices-tools.jar、lib/endorsed/webservices-api 。 jar )。这解决了 SP0105 错误,但生成了新的错误(在标题某处的 ClassCastException)。
为了修复第二个,我删除了 HeaderHandler/HeaderHandlerResolver 类,而不是:

service.setHandlerResolver(headerHandlerResolver);
endpoint = service.getPort(EFormsPortType.class);

称为:
endpoint = service.getPort(EFormsPortType.class);
Map<String, Object> requestContext = ((javax.xml.ws.BindingProvider) endpoint).getRequestContext();
requestContext.put(javax.xml.ws.BindingProvider.USERNAME_PROPERTY, config.getProperty("myUser");
requestContext.put(javax.xml.ws.BindingProvider.PASSWORD_PROPERTY, config.getProperty("myPassword");

关于Java/JAX-WS : Calling webservice works locally, 在 glassfish 上失败。身份验证问题 (SP0105),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7388008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com