webservice之cxf样例
1.首先服务接口。
package com.demo;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String sayHi(@WebParam(name="text")String text);
String sayHiToUser(User user);
String[] SayHiToUserList(List<User> userList);
}
2.编写服务实现
package com.demo;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.jws.WebService;
@WebService(endpointInterface="com.demo.HelloWorld",serviceName="HelloWorld")
public class HelloWorldImpl implements HelloWorld {
Map<Integer, User> users = new LinkedHashMap<Integer, User>();
public String sayHi(String text) {
return "Hello " + text;
}
public String sayHiToUser(User user) {
users.put(users.size()+1, user);
return "Hello "+ user.getName();
}
public String[] SayHiToUserList(List<User> userList) {
String[] result = new String[userList.size()];
int i=0;
for(User u:userList){
result[i] = "Hello " + u.getName();
i++;
}
return result;
}
}
3.公布服务
方法一:使用Sun JAX-WS 2中Endpoint.publish进行公布。(不须要其它配置与
包)
Endpoint endpoint =
Endpoint.publish("http://localhost:8080/WSCXF/helloService", new HelloServiceImpl());//这里是实现类 System.out.println("WS公布成功!");
方法二:用CXF的JaxWsServerFactoryBean类进行公布。(须要CXF相关包)
HelloServiceImpl impl = new HelloServiceImpl();
JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean(); factoryBean.setAddress("http://localhost:8080/WSCXF/helloService"); factoryBean.setServiceClass(IHelloService.class);//接口类 factoryBean.setServiceBean(impl); factoryBean.create();
System.out.println("WS公布成功!");
方法三:利用cxf和spring整合在tomcat下进行公布。
详细方法在后面的spring整合cxf时讲到。
方法四:重写loadBus方法。
书写一个类覆盖org.apache.cxf.transport.servlet.CXFNonSpringServlet的loadBus方法指定BUS以及公布你的web服务。
详细可查阅资料:
http://blog.csdn.net/zq9017197/archive/2010/12/26/6099684.aspx
4.查看web服务是否公布成功:
方法一二四訪问http://localhost:8080/WSCXF/helloService?wsdl 查看wsdl文件,方法三在后面的spring整合cxf时讲到。
二:client调用
方法一:使用标准的JAX-WS的API完毕client调用(不须要导入不论什么CXF包)
//注意。此处http://service.jaxb.com/ 来源于wsdl文件里targetNamespace
QName qName = new QName("http://service.jaxb.com/","HelloServiceImplService");
HelloServiceImplService helloServiceImplService = new HelloServiceImplService(
new URL("http://localhost:8080/WSCXF/helloService?wsdl"),qName);
IHelloService helloService =(IHelloService)helloServiceImplService.getPort(IHelloService.class);
方法二:使用CXF中JaxWsProxyFactoryBeanclient代理工厂调用web服务(须要导入CXF相关包)
JaxWsProxyFactoryBean soapFactoryBean = new JaxWsProxyFactoryBean();
soapFactoryBean.setAddress("http:// localhost:8080/WSCXF/helloService");
soapFactoryBean.setServiceClass(IHelloService.class);
Object o = soapFactoryBean.create();
IHelloService helloService = (IHelloService)o;
方法三:
String endPointAddress = "http:// localhost:8080/WSCXF/helloService";
Service service = Service.create(
new QName("http://service.jaxb.com/","IHelloService"));
service.addPort(
new QName("http://service.jaxb.com/", "IHelloServicePort"), SOAPBinding.SOAP11HTTP_BINDING, endPointAddress);
IHelloService helloService = service.getPort(IHelloService.class);
方法四:(须要导入CXF相关包)
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
org.apache.cxf.endpoint.Client client = dcf.createClient("http://127.0.0.1:8080/WSCXF/helloService?wsdl");
//sayHello 为接口中定义的方法名称 张三为传递的參数 返回一个Object数组
Object[] objects=client.invoke("sayHello", "张三");
//输出调用结果
System.out.println(objects[0].toString());
三、CXF和Spring整合服务端开发
1)新建web项目,并加入�相关包。(包含spring和cxf相关包) 2)写好一个接口和实现类。(见demo) 3)新建beans.xml文件。
<?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: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">
<!-- spring公布web服务配置 -->
<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" />
<bean id="helloService" class="com.jaxb.service.HelloServiceImpl" /> <!--
<bean id="helloService" class="com.aegis.service.HelloServiceImpl" /> -->
<!-- endpoint 方式公布web服务和 server方式一样 --> <!--
<jaxws:endpoint id="helloServiceWs" address="/helloService" implementor="#helloService" />
--> <!-- 还有一种写法,建议不要用这样的方法 ,假设实现类有的属性要通过spring依赖注入的话, 这样的方法仅仅是简单的new个实现类,他的属性没有通过spring依赖注入给注入值 --> <!--
<jaxws:endpoint id="helloServiceWs" address="/helloService" implementor="com.jaxb.service.HelloServiceImpl" />
-->
<!—以下这个是wss4j的配置,后面会讲到相关知识,须要配置在spring配置文件里 --> <!-- wss4j 服务端配置 -->
<bean id="wss4jInInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<!-- <entry key="passwordType" value="PasswordText" /> --> <!-- 密码使用MD5密文发送 -->
<entry key="passwordDigest" value="PasswordText" />
<entry key="passwordCallbackClass" value="com.security.service.ServerPasswordCallbackHandler" />
</map>
</constructor-arg>
</bean>
<jaxws:server id="helloServiceWs" address="/helloService"> <jaxws:serviceBean>
<ref bean="helloService" />
</jaxws:serviceBean><!-- 使用这样的方法公布web服务 --> <jaxws:inInterceptors>
<ref bean="wss4jInInterceptor" />
</jaxws:inInterceptors><!—wss4j配置 --> <!-- <jaxws:serviceFactory>
<ref bean="jaxWsServiceFactoryBean" />
</jaxws:serviceFactory> --><!—数据绑定方式配置 -->
</jaxws:server>
<!-- 通过Spring创建数据绑定的类-->
<!-- <bean id="aegisBean" class="org.apache.cxf.aegis.databinding.AegisDatabinding" /> <bean id="jaxWsServiceFactoryBean"
class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"> <property name="wrapped" value="true" /> <property name="dataBinding" ref="aegisBean" /> </bean> --> </beans>
4)配置web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beans.xml</param-value>
</context-param>
<listener>
<listener-class> org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
<!—在tomcat中公布须要配置servlet -->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
5)公布web项目
由于在web.xml里面配置了servlet,则能够将项目公布到tomcat下,启动tomcat就可以。
6)訪问wsdl
http://localhost:8080/WSCXF/ws/helloService?wsdl
四、CXF和Spring整合client调用
1)新建一个webclient项目,用wsdl2java生成client代码。将生成的client代码复制到src下。加入�spring相关包。
2)配置spring配置文件。
beans.xml存放在src文件夹下,详细配置例如以下:
<?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: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">
<!-- wss4j 配置在client,后面有讲到相关知识 -->
<!-- wss4j client配置 --> <bean id="wss4jOutInterceptor"
class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="user" value="Fetion" />
<!-- <entry key="passwordType" value="PasswordText" /> --> <!-- 密码使用MD5密文发送 -->
<entry key="passwordDigest" value="PasswordText" />
<entry key="passwordCallbackClass" value="com.security.client.ClientPasswordCallbackHandler" />
</map>
</constructor-arg>
</bean>
<jaxws:client id="helloServeiceClient" address="http://localhost:8080/WSCXF/ws/helloService" serviceClass="com.jaxb.client.IHelloService">
<jaxws:outInterceptors>
<ref bean="wss4jOutInterceptor" />
</jaxws:outInterceptors><!-- wss4j client配置-->
</jaxws:client>
</beans>
2) 调用web服务 在main方法中执行:
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");//此处beans.xml放在src下,也须要放在其它文件夹下,但须要注明清楚
//获取webservice服务的操作接口
IHelloService helloService = (IHelloService)app.getBean("helloServeiceClient");
五、基于soap的web服务的WS-Security安全规范
很多其它请參考原文档:
webservice之cxf样例的更多相关文章
- JBoss 系列九十九:Rest WebService jBPM 6 集成演示样例
概述 jBPM 6 提供 Rest API 供第三方应用整合使用 jBPM 6,本文演示假设通过 Rest API: 启动流程 获取流程实例信息 启动 User Task 完毕 User Task j ...
- Android平台调用Web Service:演示样例
近期在学习Android,随着移动设备的流行,当软件走上商业化的道路,为了争夺市场,肯定须要支持Android的,所以開始接触了Android,只是仅仅了解皮毛就好,由于我们要做管理者嘛,懂点Andr ...
- phoenixframe平台连接socketserver,并接收返回值的演示样例
package org.phoenix.cases.webservice; import java.util.LinkedList; import org.phoenix.action.WebElem ...
- C++的性能C#的产能?! - .Net Native 系列《三》:.NET Native部署测试方案及样例
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- MarkDown+LaTex 数学内容编辑样例收集
$\color{green}{MarkDown+LaTex 数学内容编辑样例收集}$ 1.大小标题的居中,大小,颜色 [例1] $\color{Blue}{一元二次方程根的分布}$ $\color{R ...
- 33个超级有用必须要收藏的PHP代码样例
作为一个正常的程序员,会好几种语言是十分正常的,相信大部分程序员也都会编写几句PHP程序,如果是WEB程序员,PHP一定是必备的,即使你没用开发过大型软件项目,也一定多少了解它的语法. 在PHP的流行 ...
- 关于peersim样例配置文件的超详细解读(新手勿喷)
相信很多兄弟一开始接触peersim,对配置文件还是有点不适应,我看了好久的样例的配置文件,一层层去找对应的文件的方法,终于好像悟懂了一点,记下来以后回顾. 贴上代码,一点点分析. 首先要说下所谓的配 ...
- hdu 1003 MAX SUM 简单的dp,测试样例之间输出空行
测试样例之间输出空行,if(t>0) cout<<endl; 这样出最后一组测试样例之外,其它么每组测试样例之后都会输出一个空行. dp[i]表示以a[i]结尾的最大值,则:dp[i ...
- CloudSim样例分析
自带八个样例描述: cloudsim-2.1.1\examples目录下提供了一些CloudSim样例程序,每个样例模拟的环境如下: (1)CloudSimExample1.Java:创建一个一台主机 ...
随机推荐
- maven项目部署到Repository(Nexus)
目录[-] (一)下载并安装Nexus (二)配置Nexus Repository 说明: (三)在项目中配置Nexus Repository的信息 (四)发布到Nexus Repository 本文 ...
- python手记(27)
#!/usr/bin/env python #-*- coding: utf-8 -*- import cv2 import numpy as np fn="test2.jpg" ...
- Why Python?
Python is object-oriented Structure supports such concepts as polymorphism , operation overloading , ...
- Oracle、DB2、MySql、SQLServer JDBC驱动
四种数据库JDBC驱动,还列出了连接的Class驱动名和Url Pattern,DB2包括Type 2.Type 3和Type 4三种模式.注意驱动包名称的大小写. Oralce连接驱动包名和URL ...
- mysql 结果集合切换
结果集A: 转换成为结果集B: mysql中实现例如以下: SELECT a.biz_date, CASE WHEN a.`event` = 'downClick' THEN a.uv END AS ...
- Unity 3D 文件导入出错
Unity 3D 文件导入出错 安装unity 时我选择了free版的,打开已有项目时出现例如以下错误提示 解决的方法: 先把要导入的文件先复制到unity3d安装文件夹下相应的文件夹内,之后再返回u ...
- Swift - 给表格TableView添加页眉和页脚
UITableView具有var tableHeaderView:UIView?属性和var tableFooterView:UIView?属性,可以通过给其赋值来创建列表TableView的页眉和页 ...
- Linux - VIM(VI)编辑器
VIM(VI)编辑器 简介: VI是一个命令行界面下的文本编辑工具,最早在1976年BILL Joy开发,当时的名字叫做ex.VI支持绝大多数操作系统(最早在BSD上发布),并且功能已经十分强大. 1 ...
- 理清JavaScript正则表达式
理清JavaScript正则表达式--下篇 紧接:"理清JavaScript正则表达式--上篇". 正则在String类中的应用 类String支持四种利用正则表达式的方法.分别是 ...
- java大牛list
1 Java的未来 Java能干什么.不能干什么,一开始就要搞清楚.这对于成为一个纯种的Java程序猿至关重要. 2 构建Java运行环境 Java运行在服务器,服务器都是Linux系统,对于真正程序 ...