2012-05-04 4 views
2

У нас есть некоторый существующий Java-код, запущенный на сервере Tomcat, который мы хотим разрешить коду на другой машине, поэтому мы изучаем веб-службы. Я новичок в веб-сервисах, и я думаю, что, наверное, я здесь что-то не так.Путаница о веб-сервисах

Я изучил несколько онлайн-руководств о том, как развернуть веб-службу JAX-WS в Tomcat. Я создал класс веб-службы и аннотировал его с помощью @WebService, написал файл web.xml и sun-jaxws.xml, упаковал эти файлы (а также Jar-файлы JAX-WS) в файл .war и развернул его в Tomcat , Это похоже на работу, поскольку я могу загрузить файл WSDL в браузере, указанном в Tomcat.

Это клиент веб-сервиса, с которым у меня возникают проблемы. Прежде всего, на стороне сервера есть существующие классы, которые отображаются в базе данных. Мы хотим разрешить клиенту использовать те же самые существующие классы и создавать экземпляры из них, вызывать веб-службу, а затем хранить объекты в базе данных. Однако, когда я запустил команду wsimport в отношении WSDL-файла сервера, он создал кучу классов Java, многие из которых похожи на наши существующие классы. Думаю, мы должны использовать их вместо наших существующих классов? Так много для повторного использования кода, если я не смущен, что очень возможно.

Итак, теперь я написал клиент, используя те классы, которые генерируются wsimport. Но я получаю ошибки компиляции. Некоторые из полей в наших существующих классах Java имеют тип java.net.InetAddress. Но по какой-то причине, wsimport генерируется свой собственный класс InetAddress, и это то, что он выглядит следующим образом:

package ems.server.webservices; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlType; 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "inetAddress") 
public class InetAddress { 
} 

Да это просто класс ничего в нем! Так что много ошибок компиляции я получаю сказать:

WSClient.java:37: setAddress(ems.server.webservices.InetAddress) in ems.server.webservices.NetworkAddress cannot be applied to (java.net.InetAddress) 
    networkAddress.setAddress(InetAddress.getByName("1.1.1.1")); 

Я пытаюсь создать java.net.InetAddress, но он хочет, чтобы я использовать пустой класс, который был создан с помощью wsimport. Я должен делать что-то не так. Пожалуйста, просветите меня.

+0

Посмотрите на настройку привязок JAXB. Я не уверен, что это будет полезно, но похоже, что вам нужно будет использовать некоторые настройки при создании классов. http://docs.oracle.com/javaee/5/tutorial/doc/bnbbf.html – ChadNC

ответ

2

Мы существующий код Java работает на сервере Tomcat, который мы хотим, чтобы код на другой машине для выполнения, поэтому мы ищем в веб-сервисы

веб-сервисов для этого? Зачем?

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

Действительно плохая идея. Цель Web-сервисов - не повторное использование кода, а совместимость. Попытка повторного использования бизнес-классов, которые фактически несут семантику языка программирования, который вы используете, - это не только плохая практика, но и может привести к множеству проблем, если только для большинства тривиальных веб-сервисов, где вы также контролируете клиента.

, когда я запустил команду wsimport против файла WSDL сервера, он породил кучу классов Java

При запуске wsimport все необходимые артефакты, необходимые для клиента веб-службы для общения с создается веб-сервер.Это включает в себя все классы-заглушки, которые помогают в преобразовании ваших классов во время маршаллинга/демаскирования SOAP.

Но я получаю ошибки компиляции. Некоторые из полей в наших существующих классов Java имеют тип java.net.InetAddress

java.net.InetAddress является Java конкретных класса. Вы не должны раскрывать это в первую очередь. Вот почему генератор кода создает пустой java.net.InetAddress.

Если честно, я не могу дать вам прямой ответ на эту работу. Единственный намек, который я вам мог бы дать, это то, что если вы добавите поля InetAddress с @XmlTransient, они не будут отображаться в WSDL, и у вас не будет этой проблемы. Конечно, вы не говорите, нужно ли вам это поле, возможно, мое предложение бесполезно для вас.

Но я рекомендую переключить ваш подход. Вы на неправильном пути ИМХО. Единственная рекомендация - изменить свой подход.

+0

+1 Отличный ответ – ChadNC