2010-11-03 7 views
2

У меня есть приложение для веб-сервисов на Apache Geronimo 2.1.3.Мыло, проблема с пространством имен

Я использую JAX-WS, аннотируя POJOS, используя SOAP 1.1. (с использованием Sun JDK 1.5)

Различные клиенты используют веб-службы без заминки.

Один новый клиент не работает. В работающих клиентах только дочерний элемент в soapenv: Body имеет объявление пространства имен, а дочерние элементы дочернего элемента не имеют декларации пространства имен. В новом клиенте ВСЕ потомки soapenv: Body, включая дочерние элементы ребенка, имеют объявления пространства имен.

В сущности, это работает:

<soapenv:Body> 
<ns1:Echo> 
    <Message>Hello world</Message> 
... 

Но это не делает:

<ns1:Echo> 
    <ns1:Message>Hello world</ns1:Message> 
... 

Вход в приложение будет показывать, что сообщение является недействительным, вместо "Привет мир"

Является ли это «плохим» запросом? Похоже, что он подтверждает базовый профиль WS-I?

Клиентская программа не может быть изменена. Есть ли способ переопределить что-то, чтобы заставить обе версии этого запроса работать?

ответ

2

Message и ns1:Message - это разные типы, так же как вымышленные java классы Message и ns1.Message. Сервер ожидает элемент Message, который объявлен в пространстве имен по умолчанию (там должно быть xmlns="<my.default.namespace.name>"), но оно получает <ns1:Message> и просто игнорирует его.

Если вы не можете заставить клиент отправить действительные сообщения XML мыла (в соответствии с WSDL), вы можете попытаться изменить код сервера, так что он принимает <Message> элементов как хорошо, как <ns1:Message> элементов, как <ns1:Echo> детей. Вам нужно объявить типы элементов из пространства имен ns1 и добавить элемент choice в объявление <ns1:Echo>.

+0

Действительно, аннотация @WebParam имеет возможность идентификатора пространства имен, и прямо сейчас у нас ее нет, поэтому новый клиент ошибается при назначении параметров в том же пространстве имен, что и функция. Благодаря! – ericp