2010-11-22 10 views
7

Je travaille actuellement sur un client de service Web utilisant CXF sans fichiers de configuration Spring.CXF Comment définir SoapVersion sur le port CXF sans ressort

Cela fonctionne plutôt bien mais je ne peux pas comprendre comment régler la liaison SoapVersion en utilisant l'Api Java. Utilisation d'un fichier de printemps cela se fait comme suit:

<jaxws:binding> 
    <soap:soapBinding version="1.2"/> 
</jaxws:binding> 

-vous les gars savent comment faire cela dans le code Java (sur le port, sur le SOAPBinding ...)?

Merci d'avance pour votre aide!

EDIT ----------------------

Je suis toujours coincé avec ce problème ... Je essayé d'ajouter l'annotation SOAPBinding sur l'interface comme suggéré dans une de la réponse ci-dessous mais cela n'a pas fonctionné ... Je cherche toujours un moyen de configurer manuellement mon PortType/Binding/Bus pour utiliser le savon 1.2 ...

des idées?

EDIT ----------------------

Problème résolu! En fait, j'ai répondu à ma propre question: voir ci-dessous ...

Merci!

Répondre

13

Ok, je réponds encore à ma propre question pour partager la solution. Avec l'aide des gars de la liste de diffusion CXF, j'ai trouvé une solution qui fonctionne pour moi. Il existe actuellement deux façons de résoudre le problème. Voici l'explication:

Le problème est venu de la façon dont je construisais mon service CXF.

La première solution consiste à spécifier l'emplacement WSDL au moment de la création de service:

// Create the service 
Service service = Service.create(urlToWsdl, serviceQName); 
// Access the port 
return service.getPort(serviceQName, portTypeClass); 

Ceci a résolu le problème, mais je ne voulais pas avoir ce lien vers le WSDL, alors voici la deuxième solution se débarrasse de ce lien:

// Create the service 
Service service = Service.create(serviceQName); 
// Add a Port to the service and specify the SOAP 1.2 binding 
service.addPort(serviceQName, javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING, wsUrl); 
// Access the port 
return service.getPort(serviceQName, portTypeClass); 

Dans mon projet, nous avons décidé de choisir la deuxième solution.

Espérons que cela aide!

+0

Comment puis-je le faire en utilisant cxf? Je crée un service comme ceci 'Object implementor = new DiscoveryLookupPortImpl(); Endpoint.publish ("udp: //239.255.255.250: 3702", implémenteur); 'where' classe publique DiscoveryLookupPortImpl implémente DiscoveryLookupPort' – 4ntoine

6

Easiest est probablement juste coller une annotation sur l'interface:

@BindingType(SOAPBinding.SOAP12HTTP_BINDING) 
+0

Merci pour votre réponse, mais je n'ai pas accès à l'interface ... – reef

+0

@reef: De quoi obtenez-vous la description de l'interface? –

+0

@Donal Fellows C'est le résultat d'une exécution d'outil wsdl2java. C'est essentiellement l'une de mes dépendances de projet. – reef

0

Comme suggéré par Donal Fellows Je réponds à ma question;)

En fait, la question est liée à la version Soap le serveur peut gérer. Sur le côté client, je n'ai pas besoin de spécifier que je veux utiliser Soap 1.2, il me semble qu'il suffit d'avoir le PortType dans le fichier WSDL configuré pour Soap 1.2. Mais sur le côté serveur, j'ai besoin de dire explicitement quelle version de Soap je veux. Du côté du serveur, je l'utilise encore le « printemps-mode » pour la configuration CXF donc je viens ajouté ce qui suit dans le fichier de configuration XML:

<jaxws:binding> 
    <soap:soapBinding version="1.2"/> 
</jaxws:binding> 

C'est tout! Merci pour votre temps et votre aide!

EDIT --------------------------------

En fait, cette solution ne fonctionne pas maintenant que nous contactez un serveur que nous ne gérons pas .... Nous sommes toujours bloqués avec notre problème ici ....

+1

Ok, cette solution a fonctionné comme j'ai eu accès au client et au serveur. Maintenant que je dois contacter un serveur, je ne gère pas cela ne fonctionne pas. Est-ce que vous savez comment configurer la version SOAP sans configuration Spring? – reef

0

Ancien fil. Je pensais que je posterais une solution qui a fonctionné pour moi. Dans le fichier cxf-beans.xml, j'ai changé le endpointName="tns:MR_ServerSoap12" de endpointName="tns:MR_ServerSoap". Notez que le nom du point de terminaison aura son propre nom dans votre fichier wsdl. Utilisez ce nom. Si vous utilisez le client cxf, vous pouvez utiliser la méthode suivante:

1

En outre, il peut lier plus d'un wsdl.

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
factory.setServiceClass(WebServiceClass); 
     BindingConfiguration config = new BindingConfiguration() { 

    @Override 
    public String getBindingId() { 
      // TODO Auto-generated method stub 
      return "http://www.w3.org/2003/05/soap/bindings/HTTP/";//SOAPVersion.SOAP_12.httpBindingId 
    } 
    }; 
    factory.setBindingConfig(config);