2009-11-09 74 views
2

我处于困境:我们有第三方企业系统公开基于Java的API。但是,我们是一个100%.Net的开发团队。从本质上讲,我需要用C#代码可以调用的东西包装Java API。在没有Java EE应用程序服务器的情况下使用Web服务在C#和Java之间进行互操作?

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 Communication Framework)中,您可以在任何想要的任何位置托管服务(进程内,Windows服务,IIS 6/7等)。

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

回答

0

我最终找到了比上述任何一个都容易得多的解决方案。我们创建了一些简单的类(比如在@托尔比约恩Ravn的安德森的回答掺杂()方法)与@javax.jws.WebService@javax.jws.WebMethod注释,然后使用部署它们:

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

当时我能够在http://localhost:8282/MyService?wsdl指向Visual Studio和产生一个客户。易如反掌。

我们通过这项服务在很长的时间内运行了很多请求,并没有发现任何问题。我们用Java Service Wrapper封装了它,以便在重新启动/ JVM崩溃等情况下恢复。一个穷人的应用程序服务器。

我希望这可以帮助任何其他.NET开发人员寻找与Java互操作,而无需重新映射您的大脑来做到这一点。

+0

只是为了记录。这就要求Java 6,我暗示的假设是不可用的,正如你所说的,你唯一的环境是WebSphere 6.1。 很高兴你找到了解决方案! – 2010-03-03 14:25:12

0

由于您无法更新您的JDK版本,因为我期望您与WebSphere的需求相关联,所以您可能需要考虑从apache尝试轴架构。

这将需要你编写一个只需将调用传递给java代码的web服务,但它应该为你提供上网的工具,而且它适用于老版本的java。

我希望JAX-WS将是一个问题,除非出现奇迹,你是在JDK5至少,那么JAX-WS将是有益的,因为注解使得开发更像是在.NET 2.0 WebService的模型。

1

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

我觉得这是一个很好的起点为您提供:http://docs.codehaus.org/display/JETTY/J2se6HttpServerSPI

+0

换句话说,Glassfish,JBoss或WebSphere v7不适合我们。我们的WebSphere 6.1配置仅支持旧的JAX-RPC Web服务,这很痛苦。感谢您的链接到Jetty!+1 – intoOrbit 2009-11-10 13:54:18

+0

进一步反思,如果我只是公开Web服务,为什么需要J2se6HttpServerSPI Jetty项目? – intoOrbit 2009-11-10 20:44:34

+0

“此扩展不仅用于解决内部Sun HttpServer问题(http://forums.java.net/jive/message.jspa?messageID=130831),而且还允许JAX-WS Web服务的紧密集成和小服务程序“。可能不是真的需要。但是它是一个指向可以嵌入的servlet容器和可以使用的JAX-WS实现的单一链接。我很懒惰:) – ykaganovich 2009-11-11 08:41:55

2

是。

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

http://archive.midrange.com/java400-l/200904/msg00071.html


我下载地铁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(四个文件)复制到包含所有tomcat共有的“祝福”jar文件的文件夹 - 我相信它是Tomcat 6的$ {TOMCAT}/lib。[1]

在Eclipse项目最终结束了是一个WAR文件:

  • 如果您的工作空间JRE是Java 5中,您必须添加web服务-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 /太阳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包括在部署!

  • 完成!

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

希望这有助于你:)

[1]不使他们的全球会给你的类加载器的问题!

相关问题