2010-09-03 7 views
11

Je souhaite créer un service SOAP avec plusieurs types de ports exposés, dans lequel chaque type de port dispose d'une interface distincte. J'essaye de faire ceci en utilisant JAX-WS 2.0.Publication de plusieurs ports avec un service utilisant JAX-WS 2.0 et @WebService

Exemple:

interface A: 
    ObjectA get(String name); 

interface B: 
    ObjectB get(String name); 

Service: 
    port A 
      get 
    port B 
      get 

Le problème que je vais avoir est qu'un @WebService est défini à l'aide d'une seule classe/interface, la seule façon que je suis en mesure de régler cela est d'avoir deux services distincts . Chaque service implémenté par une classe distincte avec une annotation @WebService.

Je voudrais exposer les deux ports en utilisant le même service, pour préciser que les deux font partie de la même API. Est-ce possible? Vraiment, ce que je veux, c'est avoir une sorte de support d'espace de noms imbriqué dans le WSDL, donc je peux avoir les mêmes méthodes dans différents espaces de noms. Je vais avoir des méthodes get/set/delete pour différents types de données les unes à côté des autres, mais je préfère ne pas les mettre toutes dans la même grosse interface avec getA/getB et ainsi de suite, car j'aimerais pouvoir pour ajouter plus tard de nouveaux types de données sans forcer tous les clients à régénérer à partir du nouvel ensemble de WSDL. Tous les conseils pour y parvenir sont les bienvenus, même si cela signifie utiliser une autre façon de générer le WSDL à partir du code Java.

Répondre

1

Vous pouvez essayer de renommer l'une des méthodes et définir explicitement les champs action ou nomOpération dans l'annotation @WebMethod.

1

Je suggère au lieu de définir le paramètre d'entrée en tant que chaîne, vous devriez envisager de définir un RequestType (un complexType en XSD), pour chacune de ces méthodes et qui vous donnerait les avantages suivants:
1. Si vous avoir un type complexe défini, alors la requête peut évoluer indépendamment si vous ajoutez plus d'éléments dans le type complexe, alors que la signature de la méthode web ne change pas dans le fichier wsdl.
2. Vous pouvez avoir le même nom pour les 2 méthodes que vous avez ci-dessus (disons get (...)), alors que les deux auront les différents types de requêtes. Vous pouvez y parvenir soit en définissant les deux éléments différents dans le xsd (avec le même espace de noms) avec différents noms de requête. Si vous voulez avoir le même nom pour les éléments de la requête, vous devez envisager de les définir dans des espaces de noms différents. De cette façon, dans OOP, ils seront générés dans différents paquets et donc ils peuvent avoir le même nom. Sur une autre note, je suggère qu'il est toujours bon d'avoir vos noms d'opération et les noms des messages aussi uniques et spécifiques que possible.

0

La surcharge de fonction ne sera pas acceptée dans les services Web. Je veux dire que plusieurs opérations avec le même nom ne peuvent pas être faites. Vous avez besoin du même port et du même nom d'opération pour renvoyer une classe Object différente, vous pouvez essayer ce qui suit.

Interface

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; 
    } 
} 

Dans ce cas, vous devez identifier quel objet classe doivent être retournés de la demande, puis le construire et le retour est l'un des chemin du retour.