Взаимодействовать между C # и Java с помощью веб-сервисов без сервера приложений Java EE? - PullRequest
2 голосов
/ 10 ноября 2009

Я в сложном положении: У нас есть сторонняя корпоративная система, которая предоставляет API на основе Java. Тем не менее, мы на 100% .Net-ориентированная команда разработчиков. По сути, мне нужно обернуть Java API чем-то, что может вызвать код C #.

Веб-службы были бы хороши, но единственным сервером приложений Java, поддерживаемым в нашей инфраструктуре, является WebSphere 6.1. Это означает, что древняя (и устарела) платформа веб-сервисов JAX-RPC - единственный способ для нас представить веб-сервисы. Просто получить простое доказательство концепции работы здесь было кошмаром (из-за неопытности Java, ужасного WebSphere, неуклюжего JAX-RPC и большого количества адских JAR).

Новый каркас веб-службы JAX-WS 2.0 в JAVA EE 5 выглядит великолепно - есть ли способ запустить это без целого сервера приложений Java? Например, в WCF (Windows Communication Framework) .Net вы можете размещать службы практически в любом месте (в процессе, Windows Service, IIS 6/7 и т. Д.).

Какой самый простой способ обернуть эту библиотеку некоторыми веб-сервисами?

Ответы [ 4 ]

2 голосов
/ 10 ноября 2009

Да.

Если вы можете создать метод Java, который 1) аннотируется @WebMetod и 2) принимает необходимые параметры и вызывает код вашей третьей стороны, а затем оборачивает его как веб-приложение, вы можете использовать стек Metro - https://metro.dev.java.net/ - с любым веб-контейнером Servlet 2.5 (поместите его в глобальную папку lib веб-контейнеров), чтобы предоставить вышеуказанный метод в качестве веб-службы. Мы используем встроенную Jetty, но я убедился, что это работает с Tomcat.

Я записал свои выводы в http://archive.midrange.com/java400-l/200904/msg00071.html


Я скачал Metro 1.4 с https://metro.dev.java.net/1.4/ (версия 1.5 очень новая и я на нее не смотрел), которая в итоге распаковывается в несколько jar-файлов.

Скопируйте webservices-api.jar, webservices-rt.jar, webservices-extra-api.jar и webservices-extra.jar (четыре файла) в папку, содержащую «благословенные» jar-файлы, общие для всех Tomcat - я верю в это это $ {TOMCAT} / lib для Tomcat 6. [1]

В вашем проекте Eclipse в конечном итоге будет WAR-файл:

  • Если JRE вашего рабочего пространства - Java 5, вы должны добавить webservices-api.jar в путь к классам (он не должен быть развернут в конце). Если это Java 6, вы можете пропустить этот шаг.

  • Создать класс foo.Ping в виде:


package foo;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 Ping is a simple web service class providing a "yes, we have contact" class.
 Currently the doPing() method provides a response with the host name and
 address (if available) and the current server time.

*/
@javax.jws.WebService
public class Ping {

@javax.jws.WebMethod(action = "doPing")
public String doPing() {
System.out.println("Ping.doPing() called.");

String hostName;
try {
  hostName = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
  hostName = "unknown (" + e.getMessage() + ")";
}

String hostAddress;
try {
  hostAddress = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
  hostAddress = "unknown (" + e.getMessage() + ")";
}

return "Reached '" + hostName + "' (" + hostAddress + ") at "
    + new java.util.Date() + " java.version="
    + System.getProperty("java.version", "(not set)");
  }
}

  • В своем WEB-INF / web.xml добавьте этот фрагмент:
    <listener>
    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>
    <servlet>
    <description>JAX-WS endpoint - this servlet must handle all endpoints</description>
    <display-name>webservice</display-name>
    <servlet-name>webservice</servlet-name>
    <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- each endpoint must have a mapping to the JAX-WS endpoint servlet -->

    <servlet-mapping>
    <servlet-name>webservice</servlet-name>
    <url-pattern>/ws</url-pattern>
    </servlet-mapping>
  • Создать НОВЫЙ файл WEB-INF / sun-jaxws.xml:
    <endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>
        <endpoint name='ping' implementation='foo.Ping'url-pattern='/ws'>
        </endpoint
    </endpoints>
  • Убедитесь, что и web.xml, и sun-jaxws.xml включены в развертывание!

  • Готово!

Теперь разверните ваш военный файл на подготовленном выше Tomcat и откройте «/ ws» в развернутом веб-приложении. Это может быть http://localhost:8080/foo/ws ;. Это даст вам страницу с информацией, включая ссылку на WSDL для всех веб-сервисов, включая Ping. Эту ссылку можно использовать непосредственно в любом инструменте обработки WSDL, включая инструмент веб-службы в Eclipse IDE для Java EE Разработчики и WSDCi.

Надеюсь, это поможет вам:)

[1] Если вы не сделаете их глобальными, у вас возникнут проблемы с загрузкой классов!

1 голос
/ 10 ноября 2009

Я не совсем понимаю ваше утверждение «единственный сервер приложений Java, поддерживаемый в нашей инфраструктуре, - это WebSphere 6.1» в отношении вопроса о том, как запускать другие вещи. Но нет, вам не нужен полноценный сервер приложений, чтобы открыть веб-сервис.

Я думаю, что это хорошая отправная точка для вас: http://docs.codehaus.org/display/JETTY/J2se6HttpServerSPI

0 голосов
/ 17 февраля 2010

В итоге я нашел решение, которое было намного проще, чем любое из вышеперечисленного. Мы создали несколько простых классов (например, метод doPing () в ответе @ Thorbjørn Ravn Andersen) с аннотациями @javax.jws.WebService и @javax.jws.WebMethod, а затем развернули их с помощью:

string url = "http://localhost:8282/MyService"
MyService serviceInstance = new MyService();
Endpoint svc = Endpoint.publish(url, serviceInstance);

Затем я смог указать Visual Studio на http://localhost:8282/MyService?wsdl и сгенерировать клиента. Легко, как пирог.

Мы запустили много запросов через этот сервис за большой промежуток времени и не заметили никаких проблем. Мы завернули это с помощью Java Service Wrapper, чтобы он возвращался после перезагрузок / сбоев JVM и т. Д. Сервер приложений для бедного человека.

Я надеюсь, что это может помочь любому другому разработчику .NET, желающему взаимодействовать с Java, без необходимости переделывать свой мозг, чтобы сделать это.

0 голосов
/ 10 ноября 2009

Поскольку вы не можете обновить свою версию JDK, так как я ожидаю, что вы привязаны к тому, что нужно WebSphere, вы можете захотеть попробовать работу осей осей из apache.

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

Я ожидаю, что Jax-WS будет проблемой, если каким-то чудом вы хотя бы не будете на JDK5, тогда JAX-WS будет полезен, так как аннотации делают разработку более похожей на модель веб-сервиса в .NET 2.0.

...