2012-08-22 17 views
10

私は第三者WSのクライアントを作成しようとしています。私のアプリケーションはJBoss AS 6(Apache CXF 2.3.1スタック)で動作しています。 wsconsume(wsdl2java)でクライアントコードを生成しました。私が得た例外をWSに接続しようとしたとき:Apache CXF - ポリシーの代替案はありません

No assertion builder for type http://schemas.microsoft.com/ws/06/2004/policy/http}BasicAuthentication registered. 
Exception in thread "main" org.apache.cxf.ws.policy.PolicyException: None of the policy alternatives can be satisfied. 

認証WSDLの一部は次のようになります。

<wsp:Policy wsu:Id="abc_ssl_policy"> 
    <wsp:ExactlyOne> 
     <wsp:All> 
      <http:BasicAuthentication 
       xmlns:http="http://schemas.microsoft.com/ws/06/2004/policy/http" /> 
      <sp:TransportBinding 
       xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> 
       <wsp:Policy> 
        <sp:TransportToken> 
         <wsp:Policy> 
          <sp:HttpsToken RequireClientCertificate="false" /> 
         </wsp:Policy> 
        </sp:TransportToken> 
        <sp:AlgorithmSuite> 
         <wsp:Policy> 
          <sp:Basic256 /> 
         </wsp:Policy> 
        </sp:AlgorithmSuite> 
        <sp:Layout> 
         <wsp:Policy> 
          <sp:Strict /> 
         </wsp:Policy> 
        </sp:Layout> 
       </wsp:Policy> 
      </sp:TransportBinding> 
     </wsp:All> 
    </wsp:ExactlyOne> 
</wsp:Policy> 

クライアントコード:私はコンジットを取得しようとWHE

@WebServiceClient(name = "Abc", 
       wsdlLocation = "https://hiddendomain.com/abc/abc.svc?wsdl", 
       targetNamespace = "http://tempuri.org/")     
public class Abc extends Service { 

public final static URL WSDL_LOCATION; 

public final static QName SERVICE = new QName("http://tempuri.org/", "Abc"); 
public final static QName AbcSsl = new QName("http://tempuri.org/", "abc_ssl"); 
static { 

    Authenticator.setDefault(new Authenticator() { 
     @Override 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("user", "pas".toCharArray()); 
     } 

    }); 

    URL url = null; 
    try { 
     url = new URL("https://hiddendomain.com/abc/abc.svc?wsdl"); 

    } catch (MalformedURLException e) { 
     java.util.logging.Logger.getLogger(DistrInfo.class.getName()) 
      .log(java.util.logging.Level.INFO, 
       "Can not initialize the default wsdl from {0}", "..."); 
    } 
    WSDL_LOCATION = url; 
} 

例外がスローされます:

Client client = ClientProxy.getClient(port); 
    HTTPConduit con = (HTTPConduit) client.getConduit(); <- exception 

I s私は非標準的なMSポリシーのためですが、私はこのポリシーを処理するために適切なIntercerptorが必要ですが、誰かが私にそれを行う方法を示すことができますか?

私はこのコードを使用したときに行って問題

答えて

11

(Iは、導管を取得することはできません)ここで、私はのauthに私のHTTPSの資格情報を入れる必要があり、ノーでもいけない:あなたは素晴らしいです

import org.apache.cxf.endpoint.Client; 
import org.apache.cxf.frontend.ClientProxy; 
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 
import org.apache.cxf.transport.http.HTTPConduit; 

... 

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 

//factory.getInInterceptors().add(new LoggingInInterceptor()); 
//factory.getOutInterceptors().add(new LoggingOutInterceptor()); 

factory.setServiceClass(IAbc.class); 
factory.setAddress("https://hiddendomain.com/abc/abc.svc/soap"); <- must be /soap there, otherwise 404 

IAbc info = (IAbc) factory.create(); 

Client client = ClientProxy.getClient(info); 
HTTPConduit http = (HTTPConduit) client.getConduit(); 

http.getAuthorization().setUserName("user"); 
http.getAuthorization().setPassword("pass"); 

String abc = info.abc(); 
+1

おかげで、。最初はHTTPサービスを使用していましたが、HTTPSに切り替えた後、恐ろしいPolicyExceptionが発生しました。 最初はMyService ss = new MyService(新しいURL(wsdlUrl)、新しいQName( "http://tempuri.org/"、 "MyService"))を実行しました。 IMyService port = ss.getBasicHttpBindingIMyService(); '。 私は 'JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();を実行します。 factory.setServiceClass(IMyService.class); factory.setAddress(wsdlUrl.replace( "?wsdl"、 "")); IMyServiceポート=(IMyService)factory.create(); '。 – neu242

+0

これは本当に役に立ちました!ありがとう!! –

+0

同じ問題が発生しています....コードがTomcatで動作していましたが、jbossにコードをデプロイするときにこのエラーが発生しています。クライアントプログラムの完全なコードを共有してください。 – aravind

1

。これは私のwsd:wsdlのポリシーセキュリティ問題の私の問題を解決しました。これで、CXFを使用してセキュリティ保護されたサービスを呼び出すことができます。私は私がプロジェクトからCXFバンドルを除去するための私のコード

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
    factory.setServiceClass(TicketServicePortType.class); 
    factory.setAddress("http://localhost:8090/services"); 
    TicketServicePortType port = (TicketServicePortType) factory.create(); 

    Client client = ClientProxy.getClient(port); 
    HTTPConduit http = (HTTPConduit) client.getConduit(); 

    http.getAuthorization().setUserName("user"); 
    http.getAuthorization().setPassword("password"); 


    Endpoint cxfEndpoint = client.getEndpoint(); 

    Map<String,Object> outProps = new HashMap<String,Object>(); 

    outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); 
    outProps.put(WSHandlerConstants.USER, "user"); 
    outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT); 
    outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, 
    ClientPasswordCallback.class.getName()); 

    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps); 
    cxfEndpoint.getOutInterceptors().add(wssOut); 
+0

1)outProps.put(WSHandlerConstants.PW_CALLBACK_REF、新しいClientPasswordCallback())を使用する方が良いです。 2)http.getAuthorization()のユーザー名/パスワードの初期化は役に立たないようです... – ursa

1

に以下を追加する必要があります

はすぐに助け:だけでなく、私の問題を解決し

<dependency> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-bundle</artifactId> 
    <version>2.7.17</version> 
</dependency> 
関連する問題