2011-03-01 7 views
41

Come posso modificare dinamicamente l'indirizzo utilizzato dal mio client JAXWS? Questo client è stato generato da wsimport.JAXWS - come modificare l'indirizzo dell'endpoint

+0

Vedi http://stackoverflow.com/questions/649019/how-do-i-specify-host-and-port-when-accessing- a-web-service-from-jax-ws-generated –

+0

Does * dynamically * mean * in runtime *? –

+1

Vedere http://stackoverflow.com/questions/3569075/jaxws-service-client – McDowell

risposta

9

Risolto il problema con Apache CXF.

Con solo due righe di codice! Ecco lo snippet:

URL url_wsdl = new URL("http://myserver/myservice?wsdl"); 
Service service = Service.create(url_wsdl, new QName("http://myaddress...", "ServiceName")); 
return service.getPort(MyJAXWSPortClass.class); 
+0

questo dovrebbe/dovrebbe funzionare, tuttavia la costruzione di un nuovo oggetto di servizio come questo non è una buona soluzione. fa sì che il WSDL venga nuovamente analizzato dal nuovo endpoint ed è molto costoso da fare. @ Il post di riferimento di McDowell è il modo migliore per fare ciò che viene chiesto: http://stackoverflow.com/questions/3569075/jaxws-service-client –

+0

@HelterScelter: concordato, ma in alcune situazioni questo prezzo è trascurabile, ad esempio quando un'applicazione deve solo mappare questa porta una volta all'avvio. –

+0

Funziona solo se il server "http: // myserver/myservice? Wsdl" è online. Se si dispone di più applicazioni, significa distribuirle in ordine definito, che potrebbe essere un problema (e persino impossibile in caso di dipendenze cicliche) – GKislin

0

Non sono sicuro su come farlo se si utilizza wsimport. Ho avuto lo stesso problema, quindi ho usato Intellij IDEA (versione 9) per creare il codice client per me. Ha fornito un costruttore di endpoint del servizio che accetta l'URL wsdl.

+0

Sto cercando una soluzione utilizzando wsimport. Non è possibile utilizzare Intellij IDEA –

82

È possibile ottenere ciò utilizzando l'interfaccia BindingProvider.

JAX-WS custom endpoint

/** 
* The following snippets shows how to set a custom endpoint for a JAX-WS generated WebClient on runtime 
*/ 

// Get the service and the port 
SampleService service = new SampleService(); 
Sample port = service.getESamplePort(); 

// Use the BindingProvider's context to set the endpoint 
BindingProvider bp = (BindingProvider)port; 
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://www.aviramsegal.com/ws/sample"); 

/* Optional credentials */ 
bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "user"); 
bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "password"); 
port.callSampleMethod(); 
+0

È possibile impostare l'indirizzo dell'endpoint per l'intero servizio e non per ciascun metodo separatamente? – T3rm1

+1

Questo cambia per il servizio, memorizza nella cache l'oggetto port e lo usa tutte le volte che lo desideri. –

+0

Questo è esattamente ciò che mi piace dato che a volte wsdl non è disponibile sul lato server. – havexz

0

Sono nuovo di integrazione di PayPal, io non sono sicuro di Adaptive api pagamento. Ma abbiamo il privilegio di verificare se un ID e-mail specifico abbia un account su PayPal o non utilizzi il metodo GetVerifiedStatus.

Utilizzare sotto sandbox URL WSDL per la verifica e-mail

URL: https://svcs.sandbox.paypal.com/AdaptiveAccounts?wsdl

risposta sarà come di seguito

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ns2:GetVerifiedStatusResponse xmlns:ns2="http://svcs.paypal.com/types/aa"> 
     <responseEnvelope> 
      <timestamp>2015-07-20T23:42:46.661-07:00</timestamp> 
      <ack>Success</ack> 
      <correlationId>5cea9a8575ab9</correlationId> 
      <build>17345626</build> 
     </responseEnvelope> 
     <accountStatus>UNVERIFIED</accountStatus> 
     <countryCode>IN</countryCode> 
     <userInfo> 
      <emailAddress>[email protected]</emailAddress> 
      <accountType>PERSONAL</accountType> 
      <accountId>6KD7EVWM2E2AQW</accountId> 
      <name> 
       <salutation/> 
       <firstName>anand</firstName> 
       <middleName/> 
       <lastName>anand</lastName> 
       <suffix/> 
      </name> 
      <businessName/> 
     </userInfo> 
     </ns2:GetVerifiedStatusResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

Nota: durante la creazione di stub non ha dimenticato di impostare endpoint, come di seguito . se non lo stiamo impostando, non possiamo ottenere l'output previsto.

String endpointURL = "https://svcs.sandbox.paypal.com/AdaptiveAccounts/GetVerifiedStatus"; 

utilizzo qui di seguito il metodo per aggiungere endpoint

private static void addEndPoint(AdaptiveAccountsPortType port, 
      String endpointURL) { 
     BindingProvider bp = (BindingProvider)port; 
     bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL); 

     /*List hchain = bp.getBinding().getHandlerChain(); 
     if (hchain == null) { 
      hchain = new ArrayList(); 
     } 
     hchain.add(new HTTPUserAgentHandler()); 
     bp.getBinding().setHandlerChain(hchain);*/ 
    }