【WebService】通过CXF发布WebService第一例_jsjszg的博客-程序员秘密

技术标签: exception  Java  OSGI  string  Web  query  webservice  user  class  

CXF的理论知识就不重复了。

  • 发布服务

1、在OSGI bundle中发布,所以首先创建OSGI工程,并加入CXF所需要的库文件,

       MANIFEST.MF文件内容:

       

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: MySimpleWebServiceCXF01
Bundle-SymbolicName: MySimpleWebServiceCXF01
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: mysimplewebservicecxf01.Activator
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.apache.commons.logging;version="1.0.4",
 org.osgi.framework;version="1.3.0"
Bundle-ClassPath: lib/geronimo-activation_1.1_spec-1.1.jar,
 lib/geronimo-annotation_1.0_spec-1.1.1.jar,
 lib/geronimo-javamail_1.4_spec-1.7.1.jar,
 lib/geronimo-jaxws_2.2_spec-1.1.jar,
 lib/geronimo-servlet_2.5_spec-1.1.2.jar,
 lib/geronimo-stax-api_1.0_spec-1.0.1.jar,
 lib/geronimo-ws-metadata_2.0_spec-1.1.3.jar,
 lib/jaxb-api-2.2.3.jar,
 lib/jaxb-impl-2.2.4-1.jar,
 lib/jetty-util-7.5.4.v20111024.jar,
 lib/neethi-3.0.1.jar,
 lib/saaj-api-1.3.4.jar,
 lib/saaj-impl-1.3.12.jar,
 lib/wsdl4j-1.6.2.jar,
 lib/xml-resolver-1.2.jar,
 lib/xmlschema-core-2.0.1.jar,
 .,
 lib/cxf-2.5.2.jar,
 lib/org.eclipse.equinox.http.jetty_2.0.0.v20100503.jar,
 lib/jetty-server-7.5.4.v20111024.jar,
 lib/jetty-http-7.5.4.v20111024.jar,
 lib/jetty-continuation-7.5.4.v20111024.jar,
 lib/jetty-io-7.5.4.v20111024.jar,
 lib/jetty-security-7.5.4.v20111024.jar,
 lib/stax2-api-3.1.1.jar,
 lib/wstx-asl-3.2.0.jar

  2、声明一个WebService服务接口并实现

        WebService接口文件 IUserManager.java

package mysimplewebservicecxf01.user.api;

import java.util.List;

import javax.jws.WebService;

import mysimplewebservicecxf01.user.api.model.User;

@WebService
public interface IUserManager {
    int addUser(String name);
    List<User> queryUsers();
    User queryUser(int userId);
    boolean deleteUser(int userId);
}
     Java Bean对象User.java
package mysimplewebservicecxf01.user.api.model;

public class User {
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	private int id;
	private String name;
}

      WebService的实现 UserManager.java

package mysimplewebservicecxf01.user.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import mysimplewebservicecxf01.user.api.IUserManager;
import mysimplewebservicecxf01.user.api.model.User;

public class UserManager implements IUserManager {
	Map<Integer, User> userMap = new HashMap<Integer, User>();
	int newID = 0;
	@Override
	public int addUser(String name) {
		
		int newId = this.newID++;
		System.out.println("add a user begin,userId:"+newId + ",name:"+name);
		User user = new User();
		user.setId(newId);
		user.setName(name);
		userMap.put(newId, user);
		System.out.println("add a user ok");
		return newId;
	}

	@Override
	public List<User> queryUsers() {
		System.out.println("query all users begin");
		List<User> userList = new ArrayList<User>();
		for(User user:userMap.values()){
			userList.add(user);
		}
		System.out.println("query all users end,count:"+userList.size());
		return userList;
	}

	@Override
	public User queryUser(int userId) {
		System.out.println("query a user begin, userId:"+userId);
		if(userMap.containsKey(userId)){
			User user = userMap.get(userId);
			System.out.println("query a user begin, userId:"+userId+", name:"+user.getName());
			return user;
		}
		System.out.println("query a user end,no the user("+userId+")");
		return null;
	}

	@Override
	public boolean deleteUser(int userId) {
		System.out.println("delete a user begin, userId:"+userId);
		if(userMap.containsKey(userId)){
			User user = userMap.remove(userId);
			System.out.println("delete a user end, userId:"+userId+", name:"+user.getName());
		}
		return true;
	}
}

3、实现一个WebService服务发布的工具类,用来发布WebService服务

package mysimplewebservicecxf01.publish;

import java.util.ArrayList;
import java.util.List;

import mysimplewebservicecxf01.service.interceptor.SampleInterceptorService;

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

public class ServiceManager {
	private static final ServiceManager instance = new ServiceManager();
	List<String> serviceList = new ArrayList<String>();
	
	public static ServiceManager getInstance(){
		return instance;
	}
	
	private ServiceManager(){
		
	}
	
	public void publish(Class<?> clazz, Object implObj){
		//创建WebService服务工厂
        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
        //注册WebService接口
        factory.setServiceClass(clazz);
        //发布接口
        factory.setAddress("http://localhost:9000/" +clazz.getSimpleName());
        factory.setServiceBean(implObj);
//        factory.getInInterceptors().add(new LoggingInInterceptor()); 
//        factory.getOutInterceptors().add(new LoggingOutInterceptor()); 
       factory.getInInterceptors().add(new SampleInterceptorService());
        //创建WebService
        factory.create();
	}
}

4、最后在Activator的start函数中,使用ServiceManager 将服务发布出来
package mysimplewebservicecxf01;

import mysimplewebservicecxf01.publish.ServiceManager;
import mysimplewebservicecxf01.user.api.IUserManager;
import mysimplewebservicecxf01.user.impl.UserManager;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

	private static BundleContext context;

	public void start(BundleContext bundleContext) throws Exception {
		Activator.context = bundleContext;
		
		ServiceManager.getInstance().publish(IUserManager.class, new UserManager());
  
	}

	public void stop(BundleContext bundleContext) throws Exception {
		Activator.context = null;
	}

}

  • 客户端调用服务器

package mysimplewebservicecxf01;

import java.util.List;

import mysimplewebservicecxf01.client.interceptor.SampleInterceptorClient;
import mysimplewebservicecxf01.user.api.IUserManager;
import mysimplewebservicecxf01.user.api.model.User;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

public class Client {

	public static void main(String[] args) {     
       
        IUserManager userMgr = (IUserManager) getService(IUserManager.class);
        List<User> userList = userMgr.queryUsers();
        int count = 0;
        /*还不清楚为什么,当返回的List为空时,客户端收到的却是null*/
        if(null != userList){
        	count = userList.size();
        	
        }
        System.out.println("Count:"+count);
        
        int userId01 = userMgr.addUser("User01");
        
        userList = userMgr.queryUsers();
        count = userList.size();
        System.out.println("Count:"+count);
        
        int userId02 = userMgr.addUser("User02");
        
        userList = userMgr.queryUsers();
        count = userList.size();
        System.out.println("Count:"+count);
        
        userMgr.deleteUser(userId02);
        
        userList = userMgr.queryUsers();
        count = userList.size();
        System.out.println("Count:"+count);
	}
	
	public static Object getService(Class<?> clazz){
		//创建WebService客户端代理工厂
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        //注册WebService接口
        factory.setServiceClass(clazz);
        //设置WebService地址
        factory.setAddress("http://localhost:9000/"+clazz.getSimpleName());  
        factory.getOutInterceptors().add(new SampleInterceptorClient());
        return factory.create();
	}

}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jsjszg/article/details/7433474

智能推荐

linux服务器配置python3与python2共存_To_Young的博客-程序员秘密

话不多说直接动手。我用的是xshell 服务器系统是centos 70.先从官网下载python源码wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tar.xz1.解压可以新建一个文件夹将下载的python放到这个文件里进入home文件夹输入:cd /home接着输入:mkdir python上面的命令完成后就会...

oracle数据库教基础知识,学Oracle数据库之前的基础知识_weixin_39812533的博客-程序员秘密

都说学oracle坚持写博客是个不错的办法,那么--我来了!1.关系数据库模型1.1 关系数据库中的一些术语好吧,其实我第一次学习数据库的时候,我特别的烦这些术语,本来很简单的很容易懂的词语,被他们整的。。。二维表:就是一张表,比如我们打开excel,这里可以粗略的看成一个表的结构吧。所以说,关系的逻辑结构就是一个二维表。关系(Relation):对应我们平时看见的一张表。元组(Tuple):一个...

mininet简介(二:官网翻译)_Muyan_Donny的博客-程序员秘密

在--custom文件中添加新的CLI命令在--custom文件中很容易添加新的CLI命令:def mycmd( self, line ): &amp;amp;amp;amp;amp;amp;quot;mycmd is an example command to extend the Mininet CLI&amp;amp;amp;amp;amp;amp;quot; net = self.mn output( 'mycmd invoked for', net, 'wit

【google论文二】Google文件系统(中)_chunk租约的变更_wbglearn的博客-程序员秘密

转载请注明:http://duanple.blog.163.com/blog/static/7097176720109151211526/ 作者[email protected]系统交互我们是以尽量最小化master在所有操作中的参与度来设计系统的。在这个背景下,我们现在描述下client,master以及chunkserver如何交互来实现数据变更,记录append以及快照的。3.1

视频下载工具you-get(哔哩哔哩巨好用)_诸葛头铁的博客-程序员秘密

安装pip install you-get直接下载you-get url查看视频参数you-get -i url指定清晰度下载这一步建立在查看视频参数的基础上例:想下载的视频格式为flvyou-get --format=flv url指定下载路径you-get -o 路径 url...

Python依赖打包发布详细_发布python依赖_道知极限编程的博客-程序员秘密

将Python脚本打包成可执行文件Python是一个脚本语言,被解释器解释执行。它的发布方式:.py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库。(Python官方的各种安装包就是这样做的).pyc文件:有些公司或个人因为机密或者各种原因,不愿意源码被运行者看到,可以使用pyc文件发布,pyc文件是Python解释器可以识别的二进制码,故发

随便推点

【BZOJ】1028: [JSOI2007]麻将(贪心+暴力)_aocong4527的博客-程序员秘密

http://www.lydsy.com/JudgeOnline/problem.php?id=1028表示不会贪心QAQ按顺序枚举,如果能形成刻子那么就形成刻子,否则形成顺子。orz证明?:因为按顺序枚举,所以当枚举到i,i一定要用完,所以因为&gt;3个顺子和&gt;3个刻子等价,所以考虑&lt;3个顺子。如果i是刻子,假设我们用顺子,那么显然会剩下&lt;=2个,因此不...

Popwindow 设置宽高无效的原因和解决方案_豆汤包谷饭的博客-程序员秘密

Popwindow 没有继承Viewgroup,因此最外层布局属性的宽高无效,如果布局设置wrap_content则以实际资源大小为准,例如:给布局定义背景图片,如果图片是.9格式要特别注意,设置了宽高后会默认加上没有被拉升的部分宽高。 Popwindow 显示方法有两种,即显示在某个view下和显示在窗体中的某个xy位置,如果设置了比重,Gravity.END|Gravity.TOP 此时从上到

krpano html5略缩图边框颜色,krpano加载场景缩略图列表_weixin_39996101的博客-程序员秘密

使用场景:热点关联场景,需要用于被选择的场景列表。实现代码:for(set(i,0), i LT scene.count, inc(i),txtadd(thumbname,'skin_thumb_',get(i));addlayer(get(thumbname));copy(layer[get(thumbname)].url, scene[get(i)].thumburl);set(layer[g...

微信小程序获取用户手机号码(后台asp版)_黄菊华老师的博客-程序员秘密

前端微信小程序获取code,后台使用asp获取session_key和openid;然后结合iv和encryptedData解密出微信用户手机号码【效果图】【开发流程】第1步:wx.login获取code第2步:传递code到服务器,获取session_key和openid第3步:参考官方文档getPhoneNumber,获取iv和encryptedData第4步:解密返回数据,获...

关于Java程序员最近的状况,Java开发避坑指南!_程序猿元元的博客-程序员秘密

01. 基础架构:一条SQL查询语句是如何执行的?MySQL 的逻辑架构图02. 日志系统:一条SQL更新语句是如何执行的?之前你可能经常听DBA同事说,MySQL可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢?03. 事务隔离:为什么你改了我还看不见?提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱。转账过程具体到程序里会有一系列的操作,比如查询余

python三维建模可以加 贴图_三维模型都有哪些绘制贴图的软件??_weixin_39849930的博客-程序员秘密

在影视游戏制作方面,为达到三维场景有逼真的纹理跟细腻的造型,都需要一些优秀的绘图软件工具去满足数字艺术家构思设计,常用的有:mari zbrush mudbox ps Substance Painter BodyPaint 3DCoat等等。AMari是一款The Foundry公司出品的纹理贴图软件,最初是由Weta Digital开发,有贴图之王之称。mari运用各种带有纹理的笔刷绘制,能够自...

推荐文章

热门文章

相关标签