2010-03-29 2 views
2

У меня есть устаревшее приложение Java, которое использует класс mypackage.Foo. Я хотел бы, чтобы это приложение использовало веб-службу, которая возвращает экземпляры Foo. Чтобы подключиться к этой веб-службе, я использую wsimport в WSDL для генерации артефактов, и это дает мне еще один файл Foo.java. В идеале я хотел бы сказать wsimport генерировать артефакты, которые используют исходный Foo, и не генерировать никаких дополнительных файлов Foo, но я не нашел способ сделать это. Как скомпилировать два файла Foo в Java-приложении? Кажется, мои варианты:как согласовать конфликт между исходным и сгенерированным файлом в веб-сервисах Java?

1) положить сгенерированный файл Foo в другой пакет. Но тогда присваивание otherpackage.Foo переменной mypackage.Foo не удается

2) используйте сгенерированный Foo вместо исходного Foo. В некоторых случаях это может показаться лучшим решением, но исходный Foo имеет функциональность, которая не находится в сгенерированном Foo. Кроме того, изменение приложения не представляется возможным.

3) используйте первый вариант и напишите способ вручную скопировать поля otherpackage.Foo в mypackage.Foo. Если все остальное терпит неудачу, это будет то, что я делаю, но кажется ужасно неэлегантным.

Уверен, что мне не хватает простой передовой практики. Цените любые идеи!

+0

Хотите знать, если вы когда-либо получили удовлетворительный ответ на это с помощью wsimport? У меня такая же проблема (http://stackoverflow.com/questions/2642583/correct-use-of-wsdl-generated-sources) –

+0

Коллега игры мне рабочее решение, которое использует привязки для сопоставления сложных типов WSDL с локальными классами , в основном говоря wsimport не генерировать заглушки для этих классов, а также использовать локальные. В этом примере используется maven, поэтому я не уверен, что будет выглядеть каноническая версия, но ключ был файлом bindings.xml с такими записями, как – RHH

+0

jxb: bindings version = "1.0" xmlns: jxb = "http://java.sun.com/xml/ns/jaxb "xmlns: xs =" http://www.w3.org/2001/XMLSchema "> - - RHH

ответ

1

При генерации кода Java из WSDL можно использовать Apache CXF и это wsdl2java инструмент (или с помощью Maven-CxF-Codegen-плагин) и укажите следующий параметр:

-nexclude <schema-namespace>=<java-package> 

Использование этой опции :

  • сказать инструмент wsdl2java не создавать классы из данного пространства имен XML,
  • сказать инструмент, чтобы поместить в генерируемый импорт кода из данного Java-пакета.

Конечно, ссылочный класс должен существовать в java-пакете позже во время компиляции (не требуется при генерации кода).

В вашем примере использования:

wsdl2java -nexclude <some-schema-namespace-I-dont-know>=mypackage 
+1

Это выглядит хорошо, но когда я сделайте это, я получаю сообщение об ошибке, так как сгенерированный интерфейс WebService имеет '@XmlSeeAlso ({mypackage.Obj ectFactory.class, ...}) ', и этот упомянутый класс не существует сейчас. –