当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来。毕竟是多家不同的公司的产品,研发开发语言、采用技术框架基本上是百花齐放。怎样让自家系统提供的服务具有跨平台、跨语言、跨各种防火墙,让其他公司的研发用起来没障碍和爽呢?进过前期的技术调研和实践,最终将目光放在了轻量级 webService 服务上面
公司自己实现 WebService 服务铁定不现实,如果你公司有一群热爱技术的大牛、有一颗想造轮子的匠心,有老总的支持,还是可以放手一战的。
2. JAX-WS 服务端无 MVC 框架开发实践
我这里的说的无 MVC 框架指的是没有使用任何像 Struts/Spring MVC/WebWork….这些东西,Java EE 项目最纯真的 Servlet 时代。
maven 依赖
如果是jar包方式的话,
需要如下jar。
@WebService @SOAPBinding(style = SOAPBinding.Style.RPC) public interface MyFirstWebService { /** * 执行测试的WebService方法(有参) */ @WebMethod String sayHi( @WebParam(name = "name") String name); } @WebService(endpointInterface = "com.rambo.cwe.jws.inter.MyFirstWebService") @SOAPBinding(style = SOAPBinding.Style.RPC) public class MyFirstWebServiceImpl implements MyFirstWebService { public String sayHi(String name) { return "Hi, " + name + "! "; } }
web.xml配置
<listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet> <servlet-name>MyFirstWebService</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MyFirstWebService</servlet-name> <url-pattern>/services/sayHi</url-pattern> </servlet-mapping>
服务配置文件 sun-jaxws.xml,放置到 WEB-INF
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"> <endpoint name="myFirstWebService" implementation="com.rambo.cwe.jws.impl.MyFirstWebServiceImpl" url-pattern="/services/sayHi"/> </endpoints>
3. JAX-WS 服务端与 Spring 集成开发实践
mavn 依赖需要添加的支持 jar(500K)
<dependency> <groupId>org.springframework.ws</groupId> <artifactId>spring-ws-core</artifactId> <version>2.3.0.RELEASE</version> </dependency>
Spring Bean 添加 WebServer 服务支持
<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"> <property name="baseAddress" value="http://localhost:8089/services/"/> </bean>
服务实现类 Bean 配置
客户端 JAX-WS 服务的调用
服务端编写好之后,使用 JDk 自带的 wsimport 工具生成客户端代理类。
wsimport 只需要指定 url 就能生成 java 调用的客户端,你完全不用去了解这个 WebServer 服务是用什么语言编写的。
生成客户端代理类之后,只需要两行代码就能,实现 webServer 服务的调用。
wsimport -s f: http://localhost:5050/cwe/services/sayHi?wsdl
wsimport 常用参数参考
参数 说明
-p 定义客户端生成类的包名称
-s 指定客户端执行类的源文件存放目录
-d 指定客户端执行类的class文件的存放目录
-keep 表示生成客户端执行类的源代码
-b 指定jaxws/jaxb绑定文件或额外的schemas
-extension 使用扩展来支持SOAP1.2
将代理类放入客户端,调用代码
MyFirstWebServiceImplService service = MyFirstWebServiceImplService; MyFirstWebService implPort = service.getMyFirstWebServiceImplPort; System.out.println(implPort.sayHi(“Orson”));
其实我一直想尝试,不再客户端添加任何类调用 webServer 服务,很遗憾没能成功。
最接近的的是,在客户端放入服务端的 接口类,代码可以这样写。
URL url = new URL(“http://localhost:5050/cwe/services/sayHi?wsdl”); QName serviceName = new QName(“http://impl.jws.cwe.rambo.com/”, “MyFirstWebServiceImplService”); QName portName = new QName(“http://impl.jws.cwe.rambo.com/”, “MyFirstWebServiceImplPort”); Service service = Service.create(url,serviceName); MyFirstWebService servicePort = service.getPort(portName,MyFirstWebService.class); System.out.println(servicePort.sayHi(“Orson”));
自行定义连接地址、服务名称、、端口名称,生成服务实例进行访问,代码完全没有代理类那样清晰。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/industrynews/13096.html