Каков наилучший способ предоставления службы WCF, чтобы ее можно было легко использовать из Java / CXF? - PullRequest
8 голосов
/ 23 февраля 2009

Мы написали сервис WCF, который будет использоваться магазином Java, который использует CXF для генерации адаптеров. Мы не очень знакомы с Java, но раскрыли сервис с использованием basicHttpBinding, SSL и базовой аутентификации. Интеграционные тесты показывают, что клиент .NET может нормально использовать сервис. Однако в магазине Java возникают проблемы с использованием сервиса. В частности, они получают следующую ошибку JAXB: два объявления вызывают конфликт в классе ObjectFactory. Обычно это происходит, если две операции имеют одинаковые имена и пространство имен, когда CXF пытается создать классы адаптера.

Мы не можем найти имена типов или операций, которые должны вызывать какие-либо коллизии. Мы убедились, что все пользовательские типы задают пространство имен, а tempuri.org нигде не указан в WSDL. Магазин Java подозревает, что ошибка связана с тем, что сгенерированный WSDL содержит элементы

Итак, мои вопросы:

  • Есть ли лучший способ, чем CXF для магазина Java использовать сервис WCF? Project Tango выглядит интересно, но я не знаю достаточно, чтобы сказать им, чтобы рассмотреть его использование. Является ли CXF стандартом де-факто в Java?
  • BasicHttpBinding / SSL / Basic Auth - это MS, рекомендуемые для сценариев взаимодействия, но, похоже, у клиента все еще есть проблемы взаимодействия. Должны ли мы учитывать другие привязки или настройки, чтобы их было проще использовать?
  • Есть ли способ настроить WCF так, чтобы он всегда выводил один WDSL без импорта схемы?

Ответы [ 6 ]

4 голосов
/ 23 февраля 2009

Сообщение об ошибке «Два объявления вызывают коллизию в классе ObjectFactory» обычно не имеет ничего общего с импортом. Это сообщение об ошибке JAXB, которое обычно вызывается наличием нескольких элементов или аналогичных элементов, из-за которых сгенерированные имена полей будут одинаковыми. Например, если у вас есть такие элементы, как:

а также

Это может вызвать эту ошибку. Другой использует такие вещи, как дефисы и подчеркивания и такие, которые обычно исключаются + ограничены: а также

В версии 2.1.4 вы можете попробовать запустить wsdl2java с флагом -autoNameResolution. Что ИНОГДА помогает в этом, но не всегда. К сожалению, информация, которую JAXB дает в этих случаях, почти бесполезна, и часто поиск и устранение конфликтующих типов просто проб и ошибок. : - (

1 голос
/ 24 февраля 2009

Я глубоко разбираюсь в совместимости с Java и WCF. Как сказал кто-то другой, вам нужно сгладить свой WSDL, если вы работаете с файловым WSDL. Однако я использую Netbeans 6.5, и если вы укажете реальный URL, такой как http://myservice/?wsdl, Netbeans может легко справиться со стандартным wsdl, созданным WCF. В реальной жизни вам нужно учитывать и другие вещи: управление версиями сервисов, необязательные камеры данных (не очень хорошо в Java, поэтому я предлагаю сделать все камеры данных IsRequired = true), порядок и т. Д.

По-настоящему сложным было добиться безопасности. Мне пришлось заставить работать взаимную проверку подлинности с помощью сертификата, и у нее все еще есть некоторые проблемы.

1 голос
/ 23 февраля 2009

Я разработал WCF с клиентами Axis2. Методы аутентификации, которые я успешно использую, это BasicHttpBinding / SSL / Basic (Transport) и WS-Security с именем пользователя (и MTOM).

Реализация Metro используется SUN и Microsoft для проверки взаимодействия: http://weblogs.java.net/blog/haroldcarr/archive/2007/11/metro_web_servi.html

Извините, но не имею понятия об импорте, созданном WCF для определения схемы.

0 голосов
/ 19 июля 2010

Это проблема Jaxb. Я столкнулся с той же проблемой, но вместо этого использовал опцию xmlbeans при генерации клиента wsdl2java. Честно говоря, я, кажется, предпочитаю объекты xmlbeans больше, чем jaxb, как потребителю этого веб-сервиса.

0 голосов
/ 24 февраля 2009

Проблема с xsd: import очень распространена. Некоторые наборы инструментов или среды выполнения не могут справиться с этим. Чтобы решить эту проблему, вы можете сгладить WSDL, сгенерированный WCF. Проверьте этот пост .

Что касается того, является ли CXF правильным стеком Java - я никогда не слышал об этом? Я успешно использовал AXIS, а также JAX-WS. Оба были довольно просты.

0 голосов
/ 23 февраля 2009

Единственный способ для вашего Java-клиента общаться с компонентом WCF - это один из методов HTTP - basicHttpBinding, ws * и т. Д., Как рекомендует MS. Java не может общаться с WCF через TCP или namedPipes или MSMQ и т. Д.

Я бы начал с очень простого компонента WCF - что-то с одним методом, который выплевывает строку. Получите это, работая с Java, и затем продолжайте свой путь. Убедитесь, что все, что вы выставляете, работает с базовыми типами или четко определенными объектами [DataContract].

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