A. java cxf接口反应慢
webservice的服务端是cxf整合spring,已经可以正在发布
代码如下
webservice接口:
package com.gary.test.ws.service;
import javax.jws.WebService;
@WebService
public interface GreetingService {
//传递字符串
public String greeting(String userName);
//传递javabean
public TestBean getBean();
}
webservice实现类:
package com.gary.test.ws.service.impl;
import java.util.Calendar;
import java.util.Date;
import javax.jws.WebService;
import com.gary.test.ws.service.GreetingService;
import com.gary.test.ws.service.TestBean;
@WebService(endpointInterface = "com.gary.test.ws.service.GreetingService")
public class GreetingServiceImpl implements GreetingService {
public String greeting(String userName) {
return "Hello " + userName + ", currentTime is "
+ Calendar.getInstance().getTime();
}
public TestBean getBean() {
TestBean tb = new TestBean();
tb.setProperty1("测试1");
tb.setProperty2(123);
tb.setProperty3(new Date());
return tb;
}
}
spring中配置
<jaxws:endpoint id="greetingService"
implementor="com.gary.test.ws.service.impl.GreetingServiceImpl"
address="getingService" >
</jaxws:endpoint>
B. java cxf动态调用服务端的webservices方法
WebService实现
1、 整个项目使用CXF来实现,在实现的过程中,在MyEclipse中对CXF下lib中的所有jar文件通过引入外部包来处理。
2、 在MyEclipse6.5中可以实现服务器端和客户端,但是客户端在使用wsdl进行动态调用的过程中总是报错,最后使用MyEclipse9.0实现了进行动态调用的实现。其中发生的错误如下:
(1)Exception in thread "main" java.lang.LinkageError: 正在从引导类加载器加载 JAXB 2.1 API, 但此 RI (来自jar:file:/D:/CXF/lib/jaxb-impl-2.2.5.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) 需要 2.2 API。请使用授权目录机制将 jaxb-api.jar 放在引导类加载器中。(请参阅 http://java.sun.com/j2se/1.6.0/docs/guide/standards/)
解决办法:
通过删除引入包中的jaxb-impl-2.2.5.jar文件可以解决。
(2)java.lang.IllegalArgumentException: Can not set final com.sun.tools.internal.xjc.reader.internalizer.InternalizationLogic field
C. cxf中命令wsdl2java无法运行!
这个错误是报找不到jdk路径,我之前是path全路径配置的,也报这个错误,新建了一个JAVA_HOME,然后在path引用%JAVA_HOME%就可以找到了
D. 6、CXF与spring的整合(WebService的整合)
web.xml
说明: 这里主要配置了 spring 的配置文件地址, spring 监听器、 CXF 核心控制器。
applicationContext.xml
说明:
在 spring 的配置文件中使用 jaxws:endpoint 元素来暴露 WebService ,这里有两种方式:
然后我们就可以将工程部署到 tomcat 中,在浏览器中使用
地址 http://localhost:8080/cxf_spring/myService 访问我们的 WebService 工程。
MyClient.java
注意: myService 指定我们的服务名字(在 web.xml 中配置),而 fkjava 指定服务提供者的地址(在 applicationContext.xml 中配置)。同时这种集成不好,因为将地址写死了,没有使用 spring 的注入方式。
我们看 HelloWorldWs.java 这个服务类:
可以看到其中的实际业务处理类还是使用的手工方法进行实例化,没有使用 spring 的注入方式。
在 spring 的配置文件中改变暴露 WebService 的方式:
说明: 加 # 号是为了让服务器知道这个名字不是一个类 ,而只是一个 id 。
然后改造 HelloWorldWs.java 服务类:
然后我们再次使用之前的地址进行访问,发现效果还是一样的。
在上面配置的基础上进行添加,在 applicationContext.xml 中:
此时,和以前一样我们需要在客户端(工程 Call_CXFSpring )那边加上拦截器,添加上用户名和密码的头,然后对服务器进行访问。以此来进行验证。客户端中我们运行类:
MyClient.java
访问服务端。
传统的 SSH 项目中,一般在本地是有相关的数据的,但是有一种场景是我们需要调用别人的数据,但是别人的数据不可能让我们进行修改等操作,那么别人只会暴露一个 WebService ,而我们就需要去调用别人的 WebService 服务器。我们在访问别人时,只能得到 WSDL 文档。此时我们的项目中就不需要业务逻辑组件了,直接去调用别人的 WebService 的一个代理即可。
首先我们拷贝上面的工程,改名为 cxf_springClient ,然后需要增加 struts2 的相关 jar 包:
将原有的一些包删掉,留下权限包 org.fkjava.cxf.ws.auth 。然后我们启动工程 Auth_Server 提供远程服务。在 web 工程中生成相应的包及程序。
web.xml
说明: 这里我们不再需要 CXF 的 servlet 了,因为不需要业务类了,我们直接调用远程业务即可。同时配置 struts2 的核心控制器。
applicationContext.xml
说明: 这里我们同样不需要业务类了,但是需要配置远程业务代理类( serviceClass )。同时注意:不要将端口设置为8080,会冲突。可以看到我们使用 serviceClass 将接口配置进去,而这里的 id 不能随便写,要和 action 中定义的接口名一致。由于远程服务器设置了权限拦截,所以这里使用过滤器将用户名和密码设置到 wsdl 文档的头中。然后在这个类中我们需要使用 execute 方法去获取相应的数据。
struts.xml
ListCatsAction .java
说明: 此时我们就可以使用地址 http://localhost:8080/cxf_springClient/listCats 进行访问了,当然会报找不到 jsp 的错误。
content/listCats.jsp
说明: 此时访问就可以看到
E. java web数据接口一般用什么框架和技术来实现
开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有很多种,这对于开发者如何选择带来一定的疑惑。性能Webservice的关键要素,不同的框架性能上存在较大差异,而当前在官方网站、网络资料中可以方便的找到各自框架的介绍,但是很少有针对不同框架性能测试数据。本文选择了比较流行几个框架:
Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss RESTEasy、sun JAX-WS(最简单、方便)、阿里巴巴 Dubbo(除外)等,采用Java作为测试用例,通过本机和远程两种进行测试方式,对这几种框架进行了性能测试,并对测试结果分析和性能比较,最后并对性能优异的框架进行了推荐。
目前三种主流的web服务实现方法:
REST(新型):表象化状态转变 (软件架构风格)RESTEasy、Wink、CXF、Axis2…….
SOAP(比较成熟):简单对象访问协议 Xfire、Axis2、CXF、Axis1
XML-RPC(淘汰):远程过程调用协议(慢慢被soap 所取代)
REST 简单易用,效率高,貌似未来有很大的发展空间,也有宣称rest性能个方便比soap强大的,已经有很多框架宣称对rest进行支持比如spring 3.0、struts…….. (网络观点)
SOAP 成熟度较高,安全性较好
F. 如何使用CXF将 wsdl 文件变成java文件
用myeclipse将wsdl文件生成java代码:
1、选择新建的工程后,点击右键,选择“Run As”->“Run”,如下图所示:
2、弹出如下窗口:
3、 在上图中,左边选择“Java Application”后,点击左上角的新增“”按钮new configuration,页面如下图所示:
4、在上图中,将“Include libraries when searching for a main class” 勾上,而后点击“Main class”右边的“Search”按钮,弹出窗口如下图所示:
5、在上图中输入WSDL2Java后,查找到axis这个jar包中对应类,点击“OK”按钮,此时主窗口如下图所示:
6、在上图中点击“Arguments”页签,Arguments里把要生成的web service URI或wsdl文件写进去,最后点run。在下图中输入的是wsdl文件的路径: src/wsdl/acd_accessCode_interface.wsdl、src/wsdl/acd_accessCode_service.wsdl:
7、生成的java代码如下:
G. springmvc框架如何实现像webservice一样通过wsdl2Java生成客户端代码
在用到web service时,如果是调用自己开发的web service还好,可以有一个方法的接口或参数对象实体类什么的,但如果是调用第三方的服务,除了得到web service服务地址的wsdl文档外,没有任何实质性编码的东西,写原生调用太麻烦,这时就需要自己写一个方法的接口类。
这个,目前已经有比较成熟的工具,可以自动生成,下面作一下简单的介绍。
apache的wsdl2java工具,目前貌似CXF和axis各有一套,使用方式大同小异,但生成的代码会有所区别,这时说的是CXF提供的wsdl2java工具。
wsdl2java用法:
wsdl2java -p com -d src -all aa.wsdl
-p 指定其wsdl的命名空间,也就是要生成代码的包名:
-d 指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web service的代码
-impl 生成web service的实现代码
-ant 生成build.xml文件
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
详细用法见:http://cwiki.apache.org/CXF20DOC/wsdl-to-java.html
一开始使用了CXF的这套工具,发现不是很方便,毕竟依赖CXF提供的工具jar包,个人不是很喜欢用。
后来发现JDK居然也自带了对web service生成java代码的功能,貌似1.6版本开始的,试用后发现效果十分不错,果断投入它的怀抱。下面作下简单的介绍,以备忘。
打开jdk下的bin目录 看下能否找到"wsimport.exe"这个文件
一般情况下都会有
如果没有则说明你的JDK不支持这个功能
然后在DOS窗口下输入wsimport 敲回车
如果提示错误的话 说明你的JDK环境变量还没有配好
一句话总结,如果你在dos窗口下输入wsimport正常,就可以
如果OK的话 输入以下命令就可以将wsdl文件生成java文件了
wsimporthttp://127.0.0.1/TicketMobile/services/Cococ?wsdl -keep -p com.llg.ws2 -s g:/ws
参数说明
wsimport 这个是必须的 该工具的名称
http://127.0.0.1/TicketMobile/services/Cococ?wsdl wsdl文件
-keep 是否生成源文件
-p com.llg.ws2 生成后的java包名
-s g:/ws 生成后放哪个目录
但是前几天,在对一个第三方提供的web service使用该工具生成java代码的时候,居然出错了,网上查找后终于找到原因。
使用cxf wsdl2java或javax wsimport工具的时候,可能会遇到关于生成的Response类文件名冲突的问题
Console代码
WSDLToJavaError:ThrownbyJAXB:Aclass/interfacewiththesamename"***"isalreadyinuse..
目前可选择的方案:
apache的wsdl2java工具,使用-autoNameResolution自动处理
wsdl2java -autoNameResolutionhttp://hello.joy2everyone.com/yourWebService?wsdl
JDK自带的工具
wsimport -p com.test.client -keephttp://hello.joy2everyone.com/yourWebService?wsdl-B-XautoNameResolution
2.如果web service是己方开发的,可以修改代码,使用自定义bindings,详细可看sun webservice文档
例如:
Java代码
@WebMethod
@WebResult(name="response")
(@WebParam(name="request")ValidateCCRequestrequest);
这个情况下定义的方法名,如果使用工具生成客户端代码,很可能存在Response冲突,因为定义的wsdl中会有一个关于接口方法的message
<wsdl:message name="validateCCResponse">
</wsdl:message>
方法名定义的message与接口定义返回的ValidateCCResponse,在工具生成客户端代码时就会产生命名冲突。
但是通过更改接口方法名为:
Java代码
@WebMethod
@WebResult(name="response")
(@WebParam(name="request")ValidateCCRequestrequest);
即可解决该冲突,
H. CXF解析svcwsdl文件成java格式
1.安装JDK1.5,配置系统环境变量:
下载安装JDK后,设置环境变量:
JAVA_HOME=C:/ProgramFiles/Java/jdk1.5.0_02
Path=%Path%;%JAVA_HOME%/bin(这里的%Path%指你系统已经有的一系列配置)
CLASSPATH=%JAVA_HOME%/lib
2.下载CXF,配置系统环境变量:
CXF下载地址http://cxf.apache.org/download.html
配置环境变量:
CXF_HOME=E:WebServiceCXFapache-cxf-2.1.1apache-cxf-2.1.1(以我的目录为例)
PATH后追加上“;%CXF_HOME%in”
在cmd命令行中输入wsdl2java如果显示其用法表示配置好了。
3.运行命令是:wsdl2javad:documentwebservicehello.wsdl(wsdl的路径)
4.如果没有报错就表示执行成功了,但是执行成功后的java文件生成到什么地方了?系统没有提示,当时我就用了一种最笨的方法来找,在整个电脑里面搜索才找到的,后来我才发现了规律,就是你敲入命令的时候,所处的路径,肯定就是你文件生成的地方,我当时是cmd直接进入的,
路径是C:,所以生成的文件也在这个目录下。
5.新建工程,将生成的java文件和所需要的jar包导入即可。
参考地址:
http://radio123.iteye.com/blog/1134267