2011-09-12 3 views
2

私がしたいのは、Webサービス経由で他のシステムに接続するコード(glassfishに配置された大きなWebアプリケーションの一部)を書くことです。しかし、私はクライアントのみを書いているので、WSDLを変更したり、サーバー側で何かを変更することはできないと考えています(authなど、これはおそらく問題です)。私はwebservicesには新しく、とてもきれいです - できるだけ簡単な答えを書いてください。Java/JAX-WS:webserviceの呼び出しはローカルで動作し、glassfishでは失敗します。 Auth problem(SP0105)

私はWSDLからクラスを生成し、webserviceに接続する単純なコマンドラインアプリケーションを作成し、セキュリティヘッダーを追加して(平文のユーザー名/パスワードを追加します)、いくつかのメソッドを呼び出して結果を出力します。すべてがコマンドラインで正常に動作しますが、このコードを「より大きなwebapp」(glassfishに展開)に添付すると、次のエラーが発生します。

SP0105:SymmetricBinding/AsymmetricBinding/TransportBindingアサーションが存在する必要がありますwsdl。

私はそこから手に入れません。コマンドライン(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 handleメソッド(認証はここにある:))

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> 

答えて

3
私は自分の質問にお答えします

:2をありました

上記の問題を解決するために必要なもの最初に必要だったのは、glassfish上のメトロライブラリを更新することでした(バージョン2.1.1に更新しました。更新されたライブラリlib/webservices-rt.jar、lib/webservices-tools.jar、lib/endorsed/webservices-api .jar)。 SP0105エラーは解決されましたが、新しいものが生成されました(ヘッダーのどこかでClassCastExceptionが発生しました)。 秒1を固定するために、私は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"); 
関連する問題