2010-09-03 7 views
11

Desidero creare un servizio SOAP con più tipi di porte esposti, in cui ogni tipo di porta ha un'interfaccia separata. Sto cercando di farlo usando JAX-WS 2.0.Pubblicazione di più porte con un servizio utilizzando JAX-WS 2.0 e @WebService

Esempio:

interface A: 
    ObjectA get(String name); 

interface B: 
    ObjectB get(String name); 

Service: 
    port A 
      get 
    port B 
      get 

Il problema che sto avendo è che un @WebService viene definita utilizzando una singola classe/interfaccia, quindi l'unico modo sono in grado di impostare questo sta avendo due servizi distinti . Ogni servizio implementato da una classe separata con un'annotazione @WebService.

Mi piacerebbe esporre entrambe le porte utilizzando lo stesso servizio, per chiarire che entrambi fanno parte della stessa API. È possibile?

In realtà, quello che sto cercando è una sorta di supporto dello spazio dei nomi nidificato nel WSDL, quindi posso avere gli stessi metodi in spazi dei nomi diversi. Avrò metodi get/set/delete per diversi tipi di dati uno accanto all'altro, ma preferirei non metterli tutti nella stessa grande interfaccia con getA/getB e così via, dato che mi piacerebbe essere in grado per aggiungere nuovi tipi di dati in seguito senza forzare tutti i client a rigenerarsi dal nuovo set di WSDL. Qualsiasi suggerimento su come raggiungere questo obiettivo è il benvenuto, anche se ciò significa utilizzare un altro modo di generare il WSDL dal codice java.

risposta

1

Si può provare a rinominare uno dei metodi e impostare esplicitamente i campi actionName o operationName nell'annotazione @WebMethod.

1

vorrei suggerire invece di definire il parametro di input come una stringa, si dovrebbe prendere in considerazione la definizione di un RequestType (un complexType in XSD), per ciascuno di questi metodi e che avrebbe darà i seguenti vantaggi:
1. Se hanno un tipo complesso definito, quindi la richiesta può evolvere indipendentemente dove si aggiungono più elementi nel tipo complesso, mentre la firma del metodo web non cambia in wsdl.
2. Puoi avere lo stesso nome per i 2 metodi come hai sopra (diciamo get (...)), mentre entrambi avranno i diversi tipi di richiesta. Puoi ottenere questo risultato definendo i due diversi elementi in xsd (con lo stesso spazio dei nomi) con nomi di richieste differenti. Se si desidera avere lo stesso nome per gli elementi della richiesta, è necessario considerare di definirli in spazi dei nomi diversi. In questo modo in OOP, saranno generati in diversi pacchetti e quindi possono avere lo stesso nome.

Su una nota diversa, suggerirei sempre che i nomi delle operazioni e i nomi dei messaggi siano i più specifici e specifici possibile.

0

L'overloading delle funzioni non sarà accettato nei servizi Web. Intendo che non è possibile eseguire più operazioni con lo stesso nome. Hai bisogno della stessa porta e dello stesso nome operazione per restituire oggetti di classe diversa, puoi provare quanto segue.

interfaccia

public interface OB { 
public Object get(String name); 
} 

Webservice

@Override 
@WebMethod 
public Object get(String name) { 
    if(name.equals("A")){ 
     return new ObjectA("A"); 
    }else if(name.equals("B")){ 
     return new ObjectB(1); 
    }else { 
     return null; 
    } 
} 

In questo caso è necessario identificare quale oggetto di classe devono essere restituiti dalla richiesta e poi costruirlo e tornando indietro è uno dei modo.

Problemi correlati