WebService 四种发布方式总结Author:yczhang1.CXF方式CXF与spring搭建webservice是目前最流行的方式,但是传闻cxf与jdk1.5有些不兼容,我没有遇到过,我遇到的问题是cxf与was6.1.1不兼容,表现在cxf必须的jar包“wsdl4j-1.6.2.jar”报错,报的错为:ng.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.CharacterEncodingFil ter</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-c lass><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>CXFServlet</servlet-name><url-pattern>/webservice/*</url-pattern></servlet-mapping>上述标记的地方,第一处是spring配置文件路径;第二出是wsdl地址内容;第三步,编写接口类与实现类,注意注解接口类@WebServicepublic 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配置文件“jaxws:client”该标签可以不必写,访问时可以手动拼接该url 第五步,发布,直接部署到服务器,访问:2.Xfire方式据说xfire方式已经很老了,但个人感觉,xfire方式很简单且容易配置,不知为啥过时了,也没感觉cxf、axis2哪里先进,我当时卡在cxf与was搞不定时想尝试xfire方式被周经理给拒绝了。
Xfire方式发布webservice:第一步,添加jar包,如下:第二步,修改web.xml文件第三步,编写接口类第四步,编写services.xml配置文件在WEB-INF目录下新建目录META-INF,在该目录下新建文件夹xfire,该目录下新建文件services.xml第五步,发布,部署到服务器,访问url: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文件第三步,编写实现类第四步,增加WEN-INF内容将axis.war解压下的WEN-INF文件夹内的conf、modules复制到项目WEB-INF下第五步,在WEB-INF下创建文件夹services(名字不可改),在该目录下创建文件夹(名称随意),在该目录下创建文件夹META-INF(名称不可改),在该目录下创建文件services.xml (名称不可改),该文件内容为:第六步,部署到服务器,发布URL为:4.AXIS1方式同上,不知道AXIS1哪里不好,配置也很简单,如下:第一步,添加jar包第二步,修改web.xml第三步,实现类与实体类第四步,创建配置文件:在WEB-INF下新建文件“server-config.wsdd”<?xml version="1.0"encoding="UTF-8"?><deployment xmlns="/axis/wsdd/"xmlns:java="/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="/"/> <!—此处很重要,若方法需要传实体类,则配置此处-→<beanMapping qname="myNS:User"xmlns:myNS="urn:BeanService" languageSpecificType="java:er"/></service><!—默认-→<transport name="http"><requestFlow><handler type="URLMapper"/><handlertype="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> </requestFlow></transport><transport name="local"><responseFlow><handler type="LocalResponder"/></responseFlow></transport></deployment>第五步,部署,同上。