2011-09-05 3 views
2

J'essaie de créer des proxies de services Web avec wsimport, mais une erreur se produit à cause d'un conflit. "Deux déclarations provoquent une collision dans la classe ObjectFactory."Java EE Services Web: conflit de noms

J'ai deux EJB avec Webservices déployés dans une oreille. Les deux ont une méthode avec le même nom et les mêmes paramètres. Chaque WS a son propre targetnamespace.

SEI de WS A:

@Local 
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 
@WebService(name = "AService", targetNamespace = "http://example.com/bla/a") 
public interface ASEI { 

    @WebMethod 
    @WebResult(name = "erpId") 
    public Long getId(@WebParam(name = "gid") 
    Long gid); 
} 

WebService A:

@Stateless 
@WebService(serviceName = "AWebService", 
     endpointInterface = "foo.endpointinterfaces.ASEI", 
     targetNamespace = "http://example.com/bla/a") 
@BindingType(SOAPBinding.SOAP12HTTP_BINDING) 
public class AWebService implements ASEI { 

    public Long getId(Long gid) { ... } 
} 

SEI de WS B:

@Local 
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL,  parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 
@WebService(name = "BService", targetNamespace = "http://example.com/bla/b") 
public interface BSEI { 

    @WebMethod 
    @WebResult(name = "erpId") 
    public Long getId(@WebParam(name = "gid") 
    Long gid); 
} 

Webservice B:

@Stateless 
@WebService(serviceName = "BWebService", 
     endpointInterface = "foo.endpointinterfaces.ASEI", 
     targetNamespace = "http://example.com/bla/b") 
@BindingType(SOAPBinding.SOAP12HTTP_BINDING) 
public class BWebService implements BSEI { 

    public Long getId(Long gid) { ... } 
} 

Lorsque je déploie l'application sur mon serveur Weblogic, les premiers services Web importent les déclarations xml de WS B et les utilisent pour les types de message.

WSDL A:

<definitions targetNamespace="http://example.com/bla/a" name="AWebService" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://example.com/bla/a" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/"> 
<types> 
    <xsd:schema> 
     <xsd:import namespace="http://example.com/bla/b" schemaLocation="http://192.168.178.105:7001/BWebService/AWebService?xsd=1"/> 
    </xsd:schema> 
    <xsd:schema> 
     <xsd:import namespace="http://example.com/bla/a" schemaLocation="http://192.168.178.105:7001/AWebService/AWebService?xsd=2"/> 
    </xsd:schema> 
</types> 

<message name="getId"> 
    <part name="parameters" element="tns:getId"/> 
</message> 
... 

XSD = 1:

<xs:schema version="1.0" targetNamespace="http://example.com/bla/b" xmlns:tns="http://example.com/bla/b" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="getId" type="tns:getId"/> 
    <xs:complexType name="getId"> ... </xs:complexType> 
    ... 

XSD = 2:

<xs:schema version="1.0" targetNamespace="http://example.com/bla/a" xmlns:tns="http://example.com/bla/a" xmlns:ns1="http://example.com/bla/b" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:import namespace="http://example.com/bla/b" schemaLocation="http://192.168.178.105:7001/AWebService/AWebService?xsd=1"/> 
    <xs:element name="getId" nillable="true" type="ns1:getId"/> 
    ... 

Est-il possible que chaque WS définit ses propres MessageTypes? Ou quoi d'autre puis-je faire pour créer un proxy WS? (Je ne veux pas les séparer en différentes applications Java EE.)

+0

Chris, si ma réponse ci-dessous est utile, ce serait cool si vous cliquez sur la coche et « accepter » comme la bonne réponse. Nous obtenons tous deux des points de réputation Stackoverflow lorsque vous faites cela. – twindham

Répondre

1

Je pense que vous avez peut-être un problème similaire à celui que j'ai rencontré. Mais, je ne suis pas totalement sûr, donc c'est juste une conjecture à une réponse.

J'ai trouvé qu'un fichier de liaison ayant effectué une personnalisation de classe a résolu mon problème avec les éléments et les complexTypes ayant des noms correspondants sur plusieurs schémas référencés dans un fichier wsdl singulier comme dans l'exemple ci-dessus.

Dans XSD = 1 vous avez

<xs:complexType="getId"> and <xs:element name="getId" ...> 

Et, XSD = 2 vous avez

<xs:element name="getId" ...> 

Donc, pour résoudre ce problème je quelque chose comme ça dans mon fichier de liaison ...

<jxb:bindings version="2.0" 
      xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <jxb:bindings schemaLocation="http://192.168.178.105:7001/BWebService/AWebService?xsd=1" node="//xs:element[@name='getId']"> 
     <jxb:class name="getIdElement"></jxb:class> 
    </jxb:bindings> 
</jxb:bindings> 

Ce résolu mon problème d'avoir le même nom pour un complexe Tapez et élément. Puisque vous avez le même nom pour plusieurs éléments dans deux fichiers xsd avec des espaces de noms différents, je ne suis même pas sûr que cela aidera ce problème.

Il y a beaucoup plus d'informations sur les problèmes de collision possibles et leurs solutions ici ...http://goo.gl/vlQe3

Bonne chance, TW