【问题标题】:Java/JAX-WS: Calling webservice works locally, fails on glassfish. Auth problem (SP0105)Java/JAX-WS:调用 web 服务在本地工作,在 glassfish 上失败。身份验证问题 (SP0105)
【发布时间】:2011-11-15 07:47:29
【问题描述】:

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

我能够从 WSDL 生成类,编写连接到 web 服务的简单命令行应用程序,添加安全标头(添加纯文本用户名/密码,更多内容如下),调用一些方法并打印结果。在命令行上一切正常,但如果我将此代码附加到“更大的 webapp”(部署在 glassfish 上),我会收到以下错误:

SP0105:SymmetricBinding/AsymmetricBinding/TransportBinding 断言必须存在于 wsdl 中。

我没有从那里得到它 - 如果它在命令行中工作(在 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 处理方法(auth 在这里 :))

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>

【问题讨论】:

    标签: java web-services glassfish jax-ws


    【解决方案1】:

    我会回答我自己的问题:

    解决上述问题需要做两件事。首先需要更新 glassfish 上的 metro 库(我已将其更新到 2.1.1 版,因此更新了库 lib/webservices-rt.jar、lib/webservices-tools.jar、lib/endorsed/webservices-api 。罐)。这解决了 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");
    

    【讨论】:

      猜你喜欢
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多