#java #web-services #jax-ws #java-metro-framework #tomcat7
#java #веб-сервисы #jax-ws #java-metro-framework #tomcat7
Вопрос:
Я пытаюсь создать простой веб-сервис с использованием Tomcat 7.0.11 на Windows Server 2008 R2 с использованием Metro 2.1. Я исходил из фона C # / WCF, пытаясь лучше понять совместимость веб-служб. На самом деле я следую примеру из книги Мартина Калина «Веб-службы Java запущены». У меня есть следующее:
CATALINA_HOME=c:tomcat-7.0.11
в файле catalina.properties у меня есть:
server.loader=c:/metro-2.1/bin/*.jar
(обратите внимание, я также пытался добавить этот путь в common.loader).
Я скопировал следующие файлы METRO jar в CALALINA_HOME lib:
webservices-api.jar , webservices-extra.jar , webservices-extra-api.jar , webservices-rt.jar , webservices-tools.jar
и в CALALINA_HOME одобрено:
webservices-api.jar
(обратите внимание, изначально я пытался использовать metro-on-tomcat.xml файл ant, но, похоже, он не был обновлен для tomcat 7. *)
Я также скопировал webservices-api.jar в JAVA_HOME jre lib одобрено
Я также пытался поместить другие банки METRO в вышеуказанные местоположения, но безрезультатно.
Теперь Tomcat запускается нормально и инициализирует METRO ok, вот соответствующий раздел из файла журнала catalina:
ИНФОРМАЦИЯ: Развертывание корневого каталога веб-приложения 18 мая 2011 08:00:55 com.sun.xml.ws.transport.http.servlet.ИНФОРМАЦИЯ о инициализации контекста WSServletContextListener: WSSERVLET12: инициализация прослушивателя контекста JAX-WS 18 мая 2011 08:01:07 com.sun.xml.ws.server.ИНФОРМАЦИЯ о создании базы мониторинга: корневое имя мониторинга Metro успешно установлено в: com.sun.metro: pp=/, тип = WSEndpoint, имя =-TempConvertImplService-TempConvertImplPort 18 мая 2011 08:01:08 com.sun.xml.ws.transport.http.servlet.ИНФОРМАЦИЯ о WSServletDelegate: WSSERVLET14: инициализация сервлета JAX-WS
Исходя из этого, можно подумать, что Tomcat загрузил все классы METRO. Из того, что я собрал, WSServlet является частью JAX-WS 2.1, который поставляется как часть METRO, поэтому он должен был быть загружен. Но когда я на самом деле пытаюсь перейти к WSDL моего сервиса, я получаю следующее в журнале localhost:
СЕРЬЕЗНОЕ: выделение исключения для сервлета преобразует TEMP в java.lang.Исключение ClassNotFoundException: com.sun.xml.ws.transport.http.WSServlet в org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676) в org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521) в org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)…. (остальная часть трассировки стека)
мой sun-jaxws.xml выглядит следующим образом:
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<endpoint
name="TempConvertWS"
implementation="TimeServer.TempConvertImpl"
url-pattern="/tc"
/>
</endpoints>
и соответствующий раздел из моего web.xml файл является:
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>TempConvertWS</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.WSServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TempConvertWS</servlet-name>
<url-pattern>/tc</url-pattern>
</servlet-mapping>
Кто-нибудь может понять из этого, почему Tomcat не может найти / загрузить класс WSServlet при просмотре сервиса?
Комментарии:
1. для этого требуются библиотеки jaxws-ri, которые, я думаю,
jaxws-api.jar, jaxws-rt.jar, jaxws-tools.jar, streambuffer.jar
стоит упомянуть, но это лишь некоторые. убедитесь, что они вCATALINA_HOME/lib
Ответ №1:
С Tomcat 6 я установил shared.loader в catalina.properties и добавил webservices-api.jar для <catalina-home>endorsed
Это сработало как по волшебству.
В целях разработки и тестирования вы могли бы просто поместить webservices-extra.jar , webservices-extra-api.jar , webservices-rt.jar веб-сервисы-инструменты.jar в <catalina-home>/lib
вместо использования директивы shared.loader. Я считаю, что это также более совместимо с Eclipse.
Я протестирую Tomcat 7, чтобы увидеть, отличается ли он каким-либо образом.
* Обновление: тот же трюк работает для Tomcat 7.0.14
* Update2: Извините, я не заметил этого сразу, но я только что заметил, что в вашем web.xml указанное <servlet-class>
неверно. Это должно быть com.sun.xml.ws.transport.http.servlet.WSServlet
Комментарии:
1. вам удалось заставить это работать? если да, можете ли вы предоставить решение для дальнейшего использования?