以前不知道何为单点登陆,原来其定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
为了保持数据的一致性且减小工作量,我们决定在A系统调用B系统中的方法,此时就需要首先从A系统单点登陆到B系统中才能调用。
最近我在两个系统之间写了个接口,虽然两个系统都用JAVA编写,但所用的JDK,Tomcat的版本不同,A系统用的是JDK1.6,B系统用的是JDK1.4。最开始在A系统用CXF写好服务端,在B系统也用CXF写好客户端,测试通过了。后来才知道B系统用的是JDK1.4,但CXF貌似不支持JDK1.4,在网上查说axis1.0支持JDK1.4,最后客户端改成axis1.0。
由于之前CXF,AXIS都未用过,没少折腾。
CXF构建webservice程序的大致流程如下:
首先下载cxf包,目前最新的版本是apache-cxf-2.1.,下栽地址http://cxf.apache.org/download.html。
参考JAR包
commons-logging-1.1.jar
geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)
geronimo-annotation_1.0_spec-1.1.jar (JSR 250)
geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)
geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)
geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181)
jaxb-api-2.1.jar
jaxb-impl-2.1.6.jar
jaxws-api-2.1.jar
jetty-6.1.5.jar
jetty-util-6.1.5.jar
neethi-2.0.jar
saaj-api-1.3.jar
saaj-impl-1.3.jar
stax-api-1.0.1.jar
wsdl4j-1.6.1.jar
wstx-asl-3.2.1.jar
XmlSchema-1.2.jar
xml-resolver-1.2.jar
The Spring jars (optional - for XML Configuration support):
aopalliance-1.0.jar
spring-core-2.0.4.jar
spring-beans-2.0.4.jar
spring-context-2.0.4.jar
spring-web-2.0.4.jar
And the CXF jar:
cxf-2.1.jar
1.在web.xml加载CXF
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
2.编写java接口,和接口的实现
import java.text.ParseException;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebService;
import com.thunisoft.fy.gxpt.server.webservice.bean.FyqqRespInfo;
@WebService(name="IFyqqRespService")
public interface IFyqqRespService {
public String getRespXML(@WebParam(name="cbr")String cbr) throws ParseException;
}
实现省略。。。。
3.创建beans.xml文件【当然需要在web.xml文件中加载此文件】,里面配置接口的实现类
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<!-- CXF webservice配置 -->
<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="fyqqResp"
implementor="com.test.fy.gxpt.server.webservice.service.impl.FyqqRespServiceImpl"
address="/messageServiceWS" >
</jaxws:endpoint>
-->
<jaxws:server serviceClass="com.test.fy.gxpt.server.webservice.service.IFyqqRespService" address="/messageServiceWS">
<jaxws:serviceBean>
<ref bean="fyqqRespService"/>
</jaxws:serviceBean>
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxws:outInterceptors>
</jaxws:server>
</beans>
【CXF配置文件有上面两种配置方式,一个同事在采用第一种配置方式时在同一工程中调用时没有问题,但在不同工程调用时webservice的服务端反射的DAO一直是null,不知什么原因?有知道的可以指点下。因此最好采用下面的配置方式】
这三个步骤完成了,就可以通过http://localhost:8080/Project/services/messageServiceWS?wsdl可以访问wsdl文档
CXF开发webservice客户端【jar包可以参照服务端】:
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.setServiceClass(IFyqqRespService.class);
factory.setAddress("http://192.16.12.157:8080/server/services/messageServiceWS");
IFyqqRespService service = (IFyqqRespService) factory.create();
String str = service.getRespXML(cbr);
Axis1开发webservice客户端:
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(("http://192.16.12.157:8080/server/services/messageServiceWS"));
call.setOperationName(method);// WSDL里面描述的操作名称
call.addParameter("cbr", org.apache.axis.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);// 操作的参数
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
call.setUseSOAPAction(true);// 给方法传递参数,并且调用方法
String str = (String) call.invoke(new Object[] {cbr+""});
我只把返回String 的弄成功了,返回类型为List的有待研究