Веб-сервисы Java EE: конфликт имен - PullRequest
2 голосов
/ 05 сентября 2011

Я пытаюсь создать прокси Web-сервисов с помощью wsimport, но получаю сообщение об ошибке из-за конфликта.«Два объявления вызывают конфликт в классе ObjectFactory.»

У меня есть два EJB-компонента с Web-сервисами, развернутыми в одно ухо.Оба имеют метод с одинаковым именем и параметрами.Каждый WS имеет свое собственное пространство имен назначения.

SEI 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 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) { ... }
}

Когда я развертываю приложение на своем сервере Weblogic, первые Webservices импортируют объявления XML WS B и используют их для типов сообщений.

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"/>
    ...

Есть ли способ, которыйкаждый WS определяет свои собственные типы сообщений?Или что еще я могу сделать, чтобы создать прокси WS?(Я не хочу разделять их на разные Java EE-приложения.)

1 Ответ

1 голос
/ 03 февраля 2012

Я думаю, что у вас может быть такая же проблема, как и у меня. Но я не совсем уверен, так что это только предположение при ответе.

Я обнаружил, что файл привязки, который выполнял некоторую настройку класса, устранил мою проблему с элементами и complexTypes, которые имели совпадающие имена в нескольких схемах, на которые ссылались в единственном файле wsdl, точно так же, как в вашем примере выше.

В XSD = 1 у вас есть

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

А в XSD = 2 у вас есть

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

Итак, чтобы исправить это, я использовал что-то вроде этого в моем файле привязки ...

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

Это решило мою проблему с тем же именем для complexType и элемента . Поскольку у вас одинаковое имя для нескольких элементов в двух файлах xsd с разными пространствами имен, я даже не уверен, поможет ли это этой проблеме.

Здесь можно найти больше информации о возможных проблемах столкновения и их решениях ... http://goo.gl/vlQe3

Удачи, TW

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...