使用没有Java EE应用程序服务器的Web服务在C#和Java之间进行互操作?
作者:互联网
我处于困境:我们有一个第三方企业系统,它公开了一个基于Java的API.但是,我们是一个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 Communication Framework)中,您可以在任何地方托管服务(进程内,Windows服务,IIS 6/7等).
使用某些Web服务包装此库的最轻量级方法是什么?
解决方法:
是.
如果您可以创建一个1)使用@WebMetod注释的Java方法,并且2)获取所需的参数并调用您的第三方代码,并将其作为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共有的“祝福”jar文件夹的文件夹中 – 我相信它是${ TOMCAT} / lib for 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!
>完成!
现在将war文件部署到上面准备的Tomcat,并在部署的Web应用程序下打开“/ ws”.这可能是http:// localhost:8080 / foo / ws;.这将为您提供一个页面,其中包含指向所有Web服务(包括Ping)的WSDL链接的信息.此链接可以直接用于任何WSDL处理工具,包括Eclipse IDE for Java EE Developers和WSDCi中的Web服务工具.
希望这可以帮助你:)
[1]不使它们成为全局会给你类加载器问题!
标签:java,ipc,interop,application-server,c-2 来源: https://codeday.me/bug/20191007/1863813.html