CXF: Реализовать несколько портов на одном мыле: адрес?

Мы получили WSDL от клиента, который попросил нас внедрить сервис на нашей стороне.

WSDL содержит 3 привязки портов, с разными именами и привязками, но идентичные <soap:adress> --- как это:

<port name="Name1" binding="tns:Binding1">
    <soap:address location="http://localhost/Service/ServicePort" />
</port>
<port name="Name2" binding="tns:Binding2">
    <soap:address location="http://localhost/Service/ServicePort" />
</port>
<port name="Name3" binding="tns:Binding3">
    <soap:address location="http://localhost/Service/ServicePort" />
</port>

Можно ли реализовать такой WSDL с помощью CXF?

Когда я запускаю wsdl2java, CXF генерирует 3 java-интерфейса.

Я сначала попробовал один класс реализации, как

class MyServiceClass implements Interface1, Interface2, Interface3 {...}

Но когда я развернул его и проверил с помощью SoapUI, по какой-то причине он выставит привязку порта только для Interface1и, казалось, игнорировал 2 других. Зачем?

Затем я попытался вместо этого реализовать 3 различных класса ServiceClass (каждый из которых реализует один из интерфейсов), а затем поместить несколько <jaxws:endpoint> с одинаковым address атрибуты в cxf-config.xml

Но тогда я получаю ошибку развертывания:

RuntimeException: Soap 1.1 endpoint already registered on address /Address

Есть намеки, как реализовать такой WSDL в CXF? Является ли это возможным?

1 ответ

      But when I deployed it and checked with SoapUI, for some reason, it would only expose Port-binding for Interface1, and seemed to ignore the 2 other ones. Why?

Если вы увидите свой класс реализации, вы найдете эту аннотацию,

@WebService(endpointInterface = "yourPackageName.Interface1")

Который относится только к вашему интерфейсу1. Вот почему при развертывании игнорируются реализации интерфейса rest 2.

Таким образом, вы должны реализовать эти 3 интерфейса отдельно в другом классе реализации, как вы делали в соответствии с вашим объяснением. Потому что в каждом классе реализации допускается только один endpointInterface.

Is such WSDL possible to implement with CXF?

Да, это возможно.

Во время развертывания в вашем классе издателя конечной точки вам нужно обернуть эти 3 объекта класса реализации интерфейса в один объект и опубликовать для одной конечной точки.

Я до сих пор не ясно, как это сделать, я обновлю ответ позже.

Несколько полезных ссылок: это то же самое требование, но немного запутанное.

http://cxf.547215.n5.nabble.com/Deploying-multiple-endpoints-ports-for-a-service-td569470.html

Также прочитайте о реализации конечной точки JavaBeans, я думаю, что в этом случае это будет проще, чем это.

Другие вопросы по тегам