WebService 四种发布方式总结

2023-11-15

1. CXF方式

CXF与spring搭建webservice是目前最流行的方式,但是传闻cxf与jdk1.5有些不兼容,我没有遇到过,我遇到的问题是cxf与was6.1.1不兼容,表现在cxf必须的jar包“wsdl4j-1.6.2.jar”报错,报的错为: java.lang.IncompatibleClassChangeError,明显的jar包不兼容问题,很是头痛,后来查找资料找到解决办法是,将上述jar包新建一个was共享库,可以解决,但是客户周经理不想用此种方式,因为需要修改was,于是改用了axis2方式,下文会介绍。该问题在此处做个记录,以后使用cxf与was的时候需要注意!!!

使用cxf+spring搭建WebService:

第一步,添加jar包。此处需要注意,不同环境(tomcat、was)jar也不一定相同,例如我本地cxf+spring只需要如下jar包:

而泰康的was环境则需要如下jar包:

明显的多了很多,原因应该是服务器jar包池的不同。根据错误提示缺什么补什么就可以了,注意jar包勿重复。

第二步,配置web.xml文件,如下(重要的地方已标记):

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:/applicationContext.xml</param-value>

</context-param>

   <listener>     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

   </listener>

   <!-- Character Encoding filter -->

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

   <servlet>

        <servlet-name>CXFServlet</servlet-name>  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

           <servlet-name>CXFServlet</servlet-name>

           <url-pattern>/webservice/*</url-pattern>

    </servlet-mapping>

上述标记的地方,第一处是spring配置文件路径;第二出是wsdl地址内容;

第三步,编写接口类与实现类,注意注解

接口类

@WebService

public interface SendService {

public boolean sendOA(@WebParam(name="param")String param);

public boolean sendOrg(OrgEntity org);

}

实现类

@WebService(endpointInterface="com.service.SendService",serviceName="sendService")

public class SendServiceImpl implements SendService{

public boolean sendOA(String param) {

System.out.println("-------sendOA---------param:"+param);

if(param.equals("zhoujian")){

return true;

}

return false;

}

public boolean sendOrg(OrgEntity org) {

System.out.println("-------sendOrg--begin-------");

return true;

}

}

第四步,Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>

<beans

xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:jaxws="http://cxf.apache.org/jaxws"

    xsi:schemaLocation="

      http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans.xsd

      http://cxf.apache.org/jaxws

      http://cxf.apache.org/schemas/jaxws.xsd">

<import resource="classpath:META-INF/cxf/cxf.xml"/>

    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>

   <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

  

   <jaxws:endpoint id="sendServie" implementor="com.service.impl.SendServiceImpl" 

address="/sendServie" />

<!-- <jaxws:client id="sendServiceClient" serviceClass="com.service.SendService"

address="http://10.137.138.11:9080/Wb/webservice/sendServie?wsdl"  />-->

</beans>

“jaxws:client”该标签可以不必写,访问时可以手动拼接该url

第五步,发布,直接部署到服务器,访问:

http://10.137.138.11:9080/Wb/webservice/sendServie?wsdl

2. Xfire方式

据说xfire方式已经很老了,但个人感觉,xfire方式很简单且容易配置,不知为啥过时了,也没感觉cxf、axis2哪里先进,我当时卡在cxf与was搞不定时想尝试xfire方式被周经理给拒绝了。

Xfire方式发布webservice:

第一步,添加jar包,如下:

第二步,修改web.xml文件

<servlet>

    <servlet-name>XFireServlet</servlet-name>

    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>

    <load-on-startup>0</load-on-startup>

  </servlet>

  <servlet-mapping>

    <servlet-name>XFireServlet</servlet-name>

    <url-pattern>/services/*</url-pattern>

  </servlet-mapping>

第三步,编写接口类

接口类:

public abstract interface IBankingService {

public abstract String transferFunds(String paramString1);

}

实现类:

public class BankingService implements IBankingService{

  public String transferFunds(String fromAccount)

  {

    return fromAccount+":ok";

  }

}

第四步,编写services.xml配置文件

在WEB-INF目录下新建目录META-INF,在该目录下新建文件夹xfire,该目录下新建文件services.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://xfire.codehaus.org/config/1.0">

<service>

<name>Banking</name>

<namespace>mybank</namespace>

<serviceClass>

com.mybank.xfire.example.IBankingService

</serviceClass>

<implementationClass>

com.mybank.xfire.impl.BankingService

</implementationClass>

</service>

</beans>

第五步,发布,部署到服务器,访问url:

http://localhost:9080/Xfire/services/Banking?wsdl

3. AXIS2方式

Axis2发布WebService有两种方式,其一是利用axis2插件打成aar包放到axis_war里面部署到服务器发布;其二是不打包发布(本例);我不清楚打包发布有什么好处,感觉很麻烦项目外还得部署一个war,现在介绍第二种不打包的方式,类似xfire,同时由于cxf与was不兼容导致wsdl.jar报错,但是xfire与axis2也用到wsdl.jar却不报错,我个人也是很费解,泰康项目目前使用的就是axis2方式。

Axis2发布WebService:

第一步,添加jar包,如下:

很多是吧,不过都是从axis.war里面WEB-INF下的lib目录复制来的。

第二步,修改web.xml文件

<servlet>

        <servlet-name>AxisServlet</servlet-name>  <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>AxisServlet</servlet-name>

        <url-pattern>/services/*</url-pattern>

    </servlet-mapping>

 

第三步,编写实现类

public class ServiceImpl {

public String sayHello(String name){

System.out.println("================");

return "hello:"+name;

}

}

第四步,增加WEN-INF内容

将axis.war解压下的WEN-INF文件夹内的conf、modules复制到项目WEB-INF下

第五步,在WEB-INF下创建文件夹services(名字不可改),在该目录下创建文件夹(名称随意),在该目录下创建文件夹META-INF(名称不可改),在该目录下创建文件services.xml(名称不可改),该文件内容为:

<?xml version="1.0" encoding="UTF-8"?>

<service name="axisDemo">

    <description>

        Web Service例子

    </description>

    <parameter name="ServiceClass">

        com.ServiceImpl

    </parameter>

    <messageReceivers>

        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"

            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"

       class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />

    </messageReceivers>

</service>

 

第六步,部署到服务器,发布URL为:

http://localhost:9080/Axis2Test/services/axisDemo?wsdl

 

4. AXIS1方式

同上,不知道AXIS1哪里不好,配置也很简单,如下:

第一步,添加jar包

第二步,修改web.xml

<servlet>

    <servlet-name>AxisServlet</servlet-name>

    <servlet-class>

        org.apache.axis.transport.http.AxisServlet

    </servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>AxisServlet</servlet-name>

    <url-pattern>/services/*</url-pattern>

  </servlet-mapping>

第三步,实现类与实体类

实现类:

package com;

public class Axis {

public String sayHello(String name){

System.out.println("============:"+name);

return "hi:"+name;

}

public String sayHelloToUser(User u){

System.out.println("============:"+u.getId());

System.out.println("============:"+u.getPath());

System.out.println("============:"+u.getAdd());

return "hi:"+u.getName();

}

}

实体类:

package com;

public class User {

private String id;

private String name;

private String add;

private String path;

    

    getter setter ……方法

第四步,创建配置文件:在WEB-INF下新建文件“server-config.wsdd”

<?xml version="1.0" encoding="UTF-8"?>

<deployment xmlns="http://xml.apache.org/axis/wsdd/"

         xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 <!-- globalConfiguration 标签内容为系统默认 无需更改à

 <globalConfiguration>

  <parameter name="adminPassword" value="admin"/>

  <parameter name="attachments.Directory" value="./attachments"/>

  <parameter name="attachments.implementation"

             value="org.apache.axis.attachments.AttachmentsImpl"/>

  <parameter name="sendXsiTypes" value="true"/>

  <parameter name="sendMultiRefs" value="true"/>

  <parameter name="sendXMLDeclaration" value="true"/>

  <parameter name="axis.sendMinimizedElements" value="true"/>

  <requestFlow>

   <handler type="java:org.apache.axis.handlers.JWSHandler">

    <parameter name="scope" value="session"/>

   </handler>

   <handler type="java:org.apache.axis.handlers.JWSHandler">

    <parameter name="scope" value="request"/>

    <parameter name="extension" value=".jwr"/>

   </handler>

  </requestFlow>

 </globalConfiguration>

 <handler name="LocalResponder"

          type="java:org.apache.axis.transport.local.LocalResponder"/>

 <handler name="URLMapper"

          type="java:org.apache.axis.handlers.http.URLMapper"/>

 <handler name="Authenticate"

   type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

<!—service 标签是需要配置的 -à

<!—name 是url中需要的参数 -à

 <service name="axisTest" provider="java:RPC">

  <!—allowedMethods 的value值是方法名 可以写*-à

  <parameter name="allowedMethods" value="*"/>

  <!—className的value值是类路径-à

  <parameter name="className" value="com.Axis"/>

  <!—wsdlTargetNamespace的wsdl文件中TargetNamespace的值-à

  <parameter name="wsdlTargetNamespace" value="http://service.impl.tdi.taikang.tivoli.ibm.com/"/>

   <!—此处很重要,若方法需要传实体类,则配置此处-à 

  <beanMapping qname="myNS:User" xmlns:myNS="urn:BeanService" languageSpecificType="java:com.User"/>  

 </service>

<!—默认-à

<transport name="http">

  <requestFlow>

   <handler type="URLMapper"/>

   <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>

  </requestFlow>

 </transport>

 <transport name="local">

  <responseFlow>

   <handler type="LocalResponder"/>

  </responseFlow>

 </transport>

</deployment>

第五步,部署,同上。

5. AXIS1客户端调用

此处调用方式为axis1的调用,需要传递的参数可以是字符串或实体类,字符串方式:

Service service = new Service();

Call call = (Call) service.createCall();

//wsdl地址

call.setTargetEndpointAddress(new URL(wsdlUrl));

//设定调用3分钟不返回则超时

call.setTimeout(new Integer(180000));

//命名空间(wsdl文件中的targetNameSpace属性值) 以及方法名

call.setOperationName(new QName("http://com", "sayHello"));

//参数类型

call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN);

//返回值类型

call.setReturnType(XMLType.XSD_STRING);

//参数值

String retXML2 = (String) call.invoke( new Object[] { "yczhang" });

System.out.println( retXML2);

实体类方式(调用axis2的接口有点问题):

UserEntity userEntry = new UserEntity();

userEntry.setId("yczhang");

userEntry.setName("yczhang");

Service service = new Service();

Call call = (Call) service.createCall();

//wsdl地址

call.setTargetEndpointAddress(new URL(wsdlUrl));

//设定调用3分钟不返回则超时

call.setTimeout(new Integer(180000));

//命名空间(wsdl文件中的targetNameSpace属性值) 以及方法名

call.setOperationName(new QName("http://com", "sayHelloToUser"));

//注册SimpleObject的序列化类型

QName qn = new QName("urn:BeanService", "UserEntity");

call.registerTypeMapping(UserEntity.class, qn, new BeanSerializerFactory(UserEntity.class, qn), new BeanDeserializerFactory(UserEntity.class, qn));

//参数类型(可省略)

call.addParameter("requestParam", org.apache.axis.encoding.XMLType.XSD_ANYTYPE, ParameterMode.IN);

//返回值类型

call.setReturnType(XMLType.XSD_BOOLEAN);

Boolean retXML1 = (Boolean) call.invoke( new Object[] { userEntry });

System.out.println( retXML1);

注意,实体类方式,当调用的是由axis2方式所发布的接口时,容易出现问题,表现在所传递的实体类的属性内容为null,但在该实体类内新建一属性传如该值时,却有值。应该是axis1对axis2的不兼容问题。并且调用axis2的接口时,需要在客户端写出namespace,即:

//call.setOperationName(new QName("http://localhost:9080/WS_Axis/services/axisTest", "sayHelloToUser"));

该种调用方式对于axis1的接口没问题。泰康项目最终使用的是axis1发布的接口,并使用该种方式调用的。

public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {

String wsdlUrl = "http://localhost:9080/WS_Axis/services/axisTest?wsdl";

//实体类

User user = new User();

user.setId("1");

user.setAdd("test");

user.setName("test");

user.setPath("test");

Service service = new Service();

Call call = (Call) service.createCall();

call.setTargetEndpointAddress(new URL(wsdlUrl));

        //设定调用3分钟不返回则超时

call.setTimeout(new Integer(180000));

//call.setOperationName(new QName("http://localhost:9080/WS_Axis/services/axisTest", "sayHelloToUser"));

//注册SimpleObject的序列化类型(urn:BeanService在wsdd文件内有配置)

QName qn = new QName("urn:BeanService", "User");

call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn));

        //方法名

call.setOperationName("sayHelloToUser");

        //“user”是接口服务端方法体中的实体类所声明的变量名(”say(User user)”)

call.addParameter("user", org.apache.axis.encoding.XMLType.XSD_ANYTYPE, ParameterMode.IN);

//返回值类型

call.setReturnType(XMLType.XSD_STRING);

System.out.println( call.invoke( new Object[] { user }));

}

6. AXIS2客户端调用

所需jar包:

具体代码:

public class RPClient {

public static void main(String[] args) throws AxisFault {

try {

             //实体类

UserEntity ue = new UserEntity();

ue.setId("123");

ue.setAddress("test");

ue.setMail("123");

ue.setName("yczhang");

RPCServiceClient client = new RPCServiceClient();

Options options = client.getOptions();

String url = "http://localhost:9080/WS_Axis2/services/axisDemo?wsdl";

EndpointReference end = new EndpointReference(url);

options.setTo(end);

Object[] obj = new Object[] { ue };

Class<?>[] classes = new Class[] { Boolean.class };

             //命名空间  方法名

QName qname = new QName("http://com", "sayHelloToUser");

System.out.println(client.invokeBlocking(qname, obj, classes)[0]);

catch (AxisFault e) {

e.printStackTrace();

}

}

注意 该种方式缺点是客户端实体类路径即包名必须与服务端实体类路径相同!!!但该方式可以调任何方式编写的接口!!!!

7. CXF客户端调用

使用axis、axis2客户端调用cxf接口会有问题,建议使用cxf自身客户端调用或者使用webservice Client 自动生成客户端方式

所需的jar包:

功能代码:

public class TT {

public static void main(String[] args) {

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();

Client client = dcf.createClient("http://10.137.138.11:9080/WS_CXF/webservice/sendServie?wsdl");

try {

        //此处SERVICE.com domain name is for sale. Inquire now.需要指向接口路径而非实现类

System.out.println(client.invoke(new QName("http://service.com/", "sendOA"),"test")[0]);

catch (Exception e) {

e.printStackTrace();

}

}

}

注意:若运行程序时报错“JAXB 2.0 API ….. endorsed”则需要将以下jar包放入jdk lib和jre lib

重启exlipse即可。

8. Web Service Client客户端调用

右键项目:

调用代码如下:

public class CXFClient {

public static void main(String[] args) throws Exception, IllegalAccessException, InvocationTargetException {

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();

Client client = dcf.createClient("http://localhost:9080/WS_CXF/webservice/sendServie?wsdl");

client.invoke("sendOA", "aa");

}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebService 四种发布方式总结 的相关文章

随机推荐

  • windows测试工具—syslog-server搭建

    1 解压附件小工具 双击打开 syslog server服务器就搭建好了 2 syslog server信息 IP地址为跟环境互通的小网地址 TCP UDP端口号为选择Setting gt Network 可以根据需要更改 改为UTF 8编
  • hx711基准电压_(完整版)hx711基本原理讲解

    基本原理讲解 1 5kg 传感器 满量程输出电压 激励电压 灵敏度 1 0mv v 例如 供电电压是 5v 乘以灵敏度 1 0mv v 满量程 5mv 相当于有 5Kg 重力产生时候产生 5mV 的电压 2 711 模块对产生的 5mV 电
  • CentOS 8 最新阿里YUM源

    前文 由于CentOS8 已停止服务 相关源已经停止 前期官方自带的源和前期 阿里 清华 网易 等等的源 都已无法再使用 需要更换源 安装程序时报错 Failed to synchronize cache for repo AppStrea
  • 【Spring源码系列】Bean生命周期-Bean销毁

    文章目录 前言 一 Bean销毁介绍 bean销毁的时机 spring注册DestroyBean时机 定义bean销毁方式以及源码调试 使用 PreDestroy注解 实现DisposableBean或者AutoCloseable接口 手动
  • 使用Redisson实现Java分布式锁

    在分布式系统中 实现并发控制是一个重要的问题 分布式锁是一种常见的解决方案 它可以确保在分布式环境下只有一个进程能够访问共享资源 Redis是一种流行的内存数据存储系统 它提供了分布式锁的功能 在Java中 可以使用Redisson库来集成
  • SpringBoot(三):集成Mybatis

    1 Mybatis逆向工程 逆向工程即为通过数据库逆向生成model类和mapper文件以及接口文件 步骤如下 1 1在pom文件中加入mybatis相关依赖
  • Android系列开发博客资源汇总

    CSDN博客本期热文推荐 为您介绍有关Android应用开发的10个博客 分享他们的日积月累的宝贵经验 希望这些文章对Android开发者们能有所启发和帮助 1 张国威 Android从入门到提高系列 前面写了十四篇关于界面的入门文章 大家
  • Ansible自动化运维工具之playbook剧本编写

    内容预知 目录 内容预知 1 playbook的相关知识 1 1 playbook 的简介 1 2 playbook的 各部分组成 2 基础的playbook剧本编写实例 实例1 playbook编写 apache的yum安装部署剧本 实例
  • 数据治理体系解决方案(附PPT下载)

    下载方式 迎加入星球下载所有资料 转发朋友圈截图回复666亦可下载 加入星球好资料一直有 推荐阅读 世界的真实格局分析 地球人类社会底层运行原理 不是你需要中台 而是一名合格的架构师 附各大厂中台建设PPT 亿级 无限级 并发 没那么难 论
  • java基于微信小程序的四六级英语学习测试系统 uinapp 计算机毕业设计

    通过本课题的研究与分析 能够建立一种基于微信小程序的四六级助手系统 以MySQL为数据库 后端采用Java语言SSM框架 并对系统中的各个模块功能及它们之间相互协调工作进行了详细的分析与设计 尤其是对实现方法和过程进行了细致的设计与实现 最
  • Python动态的拼接变量名

    1 可以通过python的内置函数locals 来完成 locals是python的内置函数 他可以以字典的方式去访问局部和全局变量 python里面用名字空间记录着变量 就像javascript的window一样 他记录着各种全局变量 每
  • R语言数据可视化之初级绘图(上)

    1 条形图barplot 条形图通过垂直的或者水平的条形展示了类别型变量的频数分布 barplot 可实现条形图的绘制 其调用格式为 barplot x xlab yalb horiz F barplot x xlab ylab besid
  • 3.when表达式

    val week 0 Java的 if 语句 KT的 if 是表达式 有返回值的 val info when week 1 gt 今天是星期一 非常忙碌的一天开会 2 gt 今天是星期二 非常辛苦的写需求 3 gt 今天是星期三 努力写Bu
  • GirdLayout布局实现九宫格

    利用GirdLayout布局显示3 3布局的9张图片 每张图片宽度为屏幕的1 3
  • oracle 列相同编号,Oracle查询结果中:一列中相同的值或一列中重复的值,只显示一次...

    http www itpub net thread 1768915 1 1 html 问题 CREATE TABLE test ob id VARCHAR 32 ob name VARCHAR 32 INSERT INTO test VAL
  • Ioc容器refresh总结(2)--- Spring源码从入门到精通(三十二)

    上篇文章介绍了refresh里beanFactory的创建预准备工作 refresh获取到的beanFactory是先刷新创建 在getBeanFactory获取到的 之后再给他配置忽略自动装配的依赖接口 和配置自动装配的组件 Ioc容器r
  • IAR修改字体大小,source insight中文乱码

  • Gradle学习笔记 使用插件

    前面说了不少内容 但是我看了一下Gradle官方文档内容太多太详细 其中大部分内容其实我们不需要知道 一般情况下我们应用一部分插件就可以了 自己编写Gradle任务的情况并不多见 Java插件 在build gradle文件中添加以下一句
  • 搭建GitHub授权登录

    功能 搭建 功能 实现GitHub授权 获取用户在GitHub的有关信息 搭建 注册app 在GitHub的setting gt Developer Settings 开发者设置 中 点击New OAuth App 新建OAuth应用 根据
  • WebService 四种发布方式总结

    1 CXF方式 CXF与spring搭建webservice是目前最流行的方式 但是传闻cxf与jdk1 5有些不兼容 我没有遇到过 我遇到的问题是cxf与was6 1 1不兼容 表现在cxf必须的jar包 wsdl4j 1 6 2 jar