3

我的处境很艰难: 我们有一个公开基于 Java 的 API 的第 3 方企业系统。但是,我们是一个 100% 面向 .Net 的开发团队。本质上,我需要用 C# 代码可以调用的东西来包装 Java API。

Web 服务会很棒,但我们的基础架构上唯一支持的 Java 应用程序服务器是 WebSphere 6.1。这意味着古老的(且已弃用的)JAX-RPC Web 服务框架是我们公开 Web 服务的唯一方式。仅仅在这里进行一个简单的概念验证就是一场噩梦(因为 Java 缺乏经验,WebSphere 很糟糕,JAX-RPC 很笨重,还有很多 JAR 地狱)。

JAVA EE 5 中的新 JAX-WS 2.0 Web 服务框架看起来很棒——有没有办法在没有整个 Java 应用程序服务器的情况下运行它?例如,在 .Net 的 WCF(Windows 通信框架)中,您几乎可以在任何地方托管服务(进程内、Windows 服务、IIS 6/7 等)。

用一些 Web 服务包装这个库的最轻量级的方法是什么?

4

4 回答 4

2

是的。

如果您可以创建一个 Java 方法,该方法 1) 使用 @WebMetod 注释,并且 2) 采用所需的参数并调用您的第 3 方代码,并将其包装为 Web 应用程序,您可以使用 Metro 堆栈 - https:/ /metro.dev.java.net/ - 使用任何 Servlet 2.5 Web 容器(将其放在 Web 容器全局 lib 文件夹中)以将上述方法公开为 Web 服务。我们使用的是嵌入式 Jetty,但我已经验证这适用于 Tomcat。

我在http://archive.midrange.com/java400-l/200904/msg00071.html中写下了我的发现


我从https://metro.dev.java.net/1.4/下载了 Metro 1.4 (1.5 版很新,我还没看过),最终解压成几个 jar 文件。

将 webservices-api.jar、webservices-rt.jar、webservices-extra-api.jar 和 webservices-extra.jar(四个文件)复制到包含所有 tomcat 通用的“祝福”jarfile 的文件夹 - 我相信它是 ${ Tomcat 6.[1] 的 TOMCAT}/lib

在您的 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-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>
    <小服务程序>
    <description>JAX-WS 端点 - 此 servlet 必须处理所有端点</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>

    <!-- 每个端点必须有一个到 JAX-WS 端点 servlet 的映射 -->

    <servlet 映射>
    <servlet-name>webservice</servlet-name>
    <url-pattern>/ws</url-pattern>
    </servlet-mapping>
  • 创建一个新文件 WEB-INF/sun-jaxws.xml:
    <端点 xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' 版本='2.0'>
        <端点名称='ping' 实现='foo.Ping'url-pattern='/ws'>
        </端点
    </端点>
  • 确保 web.xml 和 sun-jaxws.xml 都包含在部署中!

  • 完毕!

现在将您的war 文件部署到上面准备好的Tomcat 中,并在您部署的Web 应用程序下打开“/ws”。这可能是http://localhost:8080/foo/ws;。这将为您提供一个包含所有 Web 服务(包括 Ping)的 WSDL 链接的信息页面。此链接可直接在任何 WSDL 处理工具中使用,包括 Eclipse IDE 中用于 Java EE Developers 和 WSDCi 的 Web 服务工具。

希望这可以帮助你:)

[1] 不让它们全局化会给你类加载器问题!

于 2009-11-09T21:42:42.247 回答
1

关于如何运行其他东西的问题,我不太理解您的说法“我们的基础架构上支持的唯一 Java 应用程序服务器是 WebSphere 6.1”。但是不,您不需要一个完整的 App Server 来公开 Web 服务。

我认为这对您来说是一个很好的起点:http: //docs.codehaus.org/display/JETTY/J2se6HttpServerSPI

于 2009-11-09T21:40:40.530 回答
1

我最终找到了一个比上述任何一个都容易得多的解决方案。@javax.jws.WebService我们使用and注释创建了一些简单的类(例如 @Thorbjørn Ravn Andersen 的答案中的 doPing() 方法)@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 服务包装器包装了它,以便它在重新启动/JVM 崩溃等时恢复。一个穷人的应用程序服务器。

我希望这可以帮助任何其他希望与 Java 进行互操作的 .NET 开发人员,而无需重新映射您的大脑即可。

于 2010-02-17T19:15:11.290 回答
0

由于您无法更新您的 JDK 版本,正如我所期望的那样,您与 WebSphere 的需求相关联,您可能希望尝试从 apache 中尝试轴成名工作。

这将要求您编写一个 Web 服务,它只会将调用传递给 Java 代码,但它应该为您提供上网的工具,并且它适用于旧版本的 Java。

我希望 Jax-WS 会成为一个问题,除非您至少在 JDK5 上出现奇迹,然后 JAX-WS 会有所帮助,因为注释使开发更像 .NET 2.0 下的 Web 服务模型。

于 2009-11-09T21:33:47.663 回答