CXF: метод мешает другим методам, org.apache.cxf.interceptor.Fault: Часть сообщения [...] не была распознана - PullRequest
0 голосов
/ 17 марта 2012

ОБНОВЛЕНИЕ: я свел проблему к двум методам, начинающимся с параметра с тем же именем.Я отправил сообщение об ошибке в CXF с демонстрационным кодом: https://issues.apache.org/jira/browse/CXF-4201

Я пытаюсь разработать простой веб-сервис с использованием Spring и Apache CXF 2.5.2.Моей первой попыткой было начать с Java и сгенерировать WSDL.Однако я не смог заставить работать параметры массива сложных типов (см. Также мой другой вопрос SO).

Теперь я попытался взять WSDL, сгенерированный из этого, и использовать его в качестве отправной точки.Я создаю сервис с плагином maven cxf wsdl2java, а также клиентом для тестирования (тот, который вызывает каждый метод один раз со значениями параметров, такими как null или 0) - пока они имеют только реализации по умолчанию.

IПо сути, у меня есть весенний конфиг из примера на домашней странице cxf

<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

<jaxws:endpoint 
  id="myService" 
  implementor="bla.blubb.myServiceImpl" 
  implementorClass="bla.blubb.myServiceImpl" 
  address="/myservice" />

Теперь, кажется, работает намного больше вещей, но я обнаружил, что один из методов мешает другим.Если я прокомментирую это в классе интерфейса, все другие вызовы методов будут работать нормально (я сохранил тот же WSDL, но Jetty только жалуется, что не может найти реализацию для других методов, поэтому они не будут доступны).Если я удаляю комментарии, вдруг некоторые другие методы начинают давать сбой с сообщением об ошибке, например

WARNING: Interceptor for {myservice/}service#{myservice}weirdmethod has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Message part {http://myservice/}someparam was not recognized.  (Does it exist in service WSDL?)

И это несмотря на то, что «злой метод» даже не вызывается из клиента.

Я посмотрел на него, и кажется, что злой метод - единственный, который имеет возвращаемый тип, который содержит массив объектов другого типа (а не массив строк или другие "нормальные" вещи).Поскольку раньше у меня были такие проблемы с массивами, я подозревал, что это может быть причиной проблемы.Но затем я попытался закомментировать все другие методы в интерфейсе, кроме злого метода.Теперь злой метод работает.

Я не очень хорошо понимаю WSDL, но на самом деле он мне подходит.Определение возвращаемого типа злого метода содержит строку

<xs:element maxOccurs="unbounded" minOccurs="0" name="things" type="tns:thing"/>

, и вещь также определяется как тип в другом месте.

К сожалению, я не могу опубликовать полный WSDL, поскольку онклиентский проект.

Спасибо за любые указатели, у меня действительно заканчиваются идеи.

...