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, я думаю, что в этом случае это будет проще, чем это.