2010-03-10 9 views
0

Je suis en train de mettre en œuvre des versions mineures dans JAX-WS comme suit:annotations @WebService multiples dans JAX-WS/CXF

@WebService(targetNamespace="http://mycompany.com/api/Service/v1_0") 
public interface ServiceRev0 { 
    public void initialMethod(); 
} 

@WebService(targetNamespace="http://mycompany.com/api/Service/v1_1") 
public interface ServiceRev1 { 
    public void newMethod(); 
} 

public class Service implements ServiceRev0, ServiceRev1 { 
    ... 
} 

Endpoint.publish("api", new Service()); 

Malheureusement, CXF ne semble 'voir' la première interface et ses méthodes associées . Est-il possible de faire ce que je veux ou devrais-je prendre une autre approche?

Répondre

0

Il semble logique de se tromper. Lorsque vous ajoutez une annotation @WebService si elle est sur une classe, cela signifie qu'il s'agit d'une implémentation de service Web, si sur une interface, cela signifie définir une interface de service Web. La définition ci-dessus aboutit à deux WSDL différents avec des opérations différentes, mieux vaut définir deux interfaces de service Web différentes et fournir des implémentations appropriées.

+0

Je suis assez certain qu'un WSDL est tout à fait capable de mettre en œuvre cette manière standard comme le .NET Framework gère cette situation avec facilité. –

+0

le cadre .NET gère cette situation? Comment gère-t-il? les deux opérations dans le même WSDL? – shivaspk

+0

Oui, les deux opérations existent dans le même WSDL, mais elles ont des espaces de noms différents (je crois). –

0

Hmmm. Cela ressemble beaucoup à la Deadly Diamond of Death problem canalisée par CXF! Je sais que c'est vieux, mais je voudrais essayer de déclarer explicitement les méthodes concrètes comme dans la deuxième et la troisième réponse de this question, et essayez à nouveau.

(J'espère que je ne suis pas mal pour commenter un vieux article!)

0

J'ai eu un même problème en utilisant CxF 3.
Solution/solution consiste à créer 3ème interface qui étend les interfaces qui besoin d'être exposé.

@WebService(targetNamespace="http://mycompany.com/api/Service/v2") 
public interface ServiceRev extends ServiceRev1, ServiceRev2 
{ 
} 

Expose:

public class ServiceRevImpl implements ServiceRev 
{ 
.... 
}