【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

智能推荐

基于WebGL的3D技术在网页中的运用 ThingJS_web3d技术网页_ThingJS_小锘的博客-程序员秘密

Three.js、ThingJS这些引擎库可以加载3D制作软件的模型,大幅度提高了制作效率,改变WebGL开发困难的局面,让Web开发者享受便捷的3D开发服务。三者的开发难度对比如下:ThingJS(框架)&lt; Three.js(引擎)&lt; WebGL(接口)3D绘图标准 - WebGLWebGL是一种3D绘图标准,通过结合Javascript和OpenGL ES 2.0,可以为HTML5的Canvas标签提供硬件3D加速渲染,这样Web开发人员可以借助系统显卡在浏览器里更流畅地展示3D

程序员实用小程序_我从阅读《实用程序员》中学到了什么_cumi7754的博客-程序员秘密

程序员实用小程序In short: old but gold. 简而言之:古老而又黄金。 Published in 1999, The Pragmatic Programmer is a book about how to become a Pragmatic Programmer. Which really means a ‘Good Programmer’. 《实用程序员》于1999年出版...

维基解密创始人被捕,从“天才黑客”到“阶下之囚”_AI科技大本营的博客-程序员秘密

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」明日开启,扫码咨询↑↑↑来源|大数据文摘(公众号ID:BigDataDigest)4月11日,阿桑奇被...

Saying Good-bye to Cambridge Again__涅槃的博客-程序员秘密

Saying Good-bye to Cambridge Again      Very quietly I take my leave,      As quietly as I came here;       Quietly I wave good-bye,       To the rosy clouds in the western sky.      The golden wi

Log4j,Log4j2,logback,slf4j日志学习_rj597306518的博客-程序员秘密

日志学习笔记Log4jLog4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、数据库等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。Log4j有7种不同的log级别,按照等级从低到高依次为:TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OF

优水•智能水箱系统(项目)_智能水箱应用场景_东小东_博客的博客-程序员秘密

此为博主本人的一个系统性课程设计摘要:优水•智能水箱系统定位于定制型楼顶水箱的管理。系统使用有WiFi组网技术、水位检测技术、霍尔接近开关技术、安卓编程技术等技术相互结合,实现多级控制台管理和控制水箱功能,使家庭水箱的管理更加便捷及人性化。在信息化迅速发展的今天,我国许多地区水塔水箱供水系统的硬件设施和软件技术落后,在水井距离用水点较远的场合,或者用水高峰期时,通常需要水塔水箱来供应生...

随便推点

如何做一份清晰易懂的软件设计?_如何设计软件_weiyi_world的博客-程序员秘密

在进行软件开发之前,拥有一份清晰的软件设计文档进行开发全程的指导十分重要。在软件团队,经常发生人员流动,在完成一个项目的过程中,一个软件模块可能会流经N个人的手。如果没有一分清晰的设计,模块的设计思路经过多人之后可能已经走偏,即使能保证原来的思路进行,中间也势必造成很大的成本浪费。 软件设计的工作属于架构师或可以叫做技术负责人,架构师的职责是保证软件设计可以满足用...

CSU 1105_柠檬与茉莉的博客-程序员秘密

A - 打怪升级Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %lluSubmit Status Practice CSU 1105Appoint description: System Crawler  (2015-03-10)Description

记录一下前端校验的方法_旗木卡卡西zz的博客-程序员秘密

button[disabled] { background: #DDDDDD; pointer-events: none; cursor: not-allowed; }首先给按钮添加失效样式&lt;div class="layui-input-inline"&gt; ...

2021阿里巴巴最新分享1000道Java后端核心知识笔记(全是重点)_Java架构师课代表的博客-程序员秘密

进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全其中概括的知识点有:Java基础、spring、springmvc、springboot、springcloud、JVM、Tomcat、dubbo、netty、zookeeper共有500+道面试题面试题整理十分全面,文末还有答案解析!(文章比较长,耐心看完,让你面试提升一大截!)获取以下面试专题答案的朋友们文末附有免费领取方式Java基础Java概述 何为编程 什.

<Linux>AM3358内核移植与根文件系统的制作_am3358移植qnx_Stephen_Lu_Fahai的博客-程序员秘密

唉....当了太久的咸鱼了...遇到各种坑,翻了好多资料....杂七杂八的乱成一团。。现在抽空整理一下,以便日后可以参考。这段时间,零零碎碎地做了不少东西,先是移植了2440的uboot,内核以及根文件系统的制作,这部分有一些参考的视频,2440板子玩的人也比较多,所以参考资料相对较多。。对这一部分就不整理了。之后主要是对一块am3358的板子进行移植,这块板子的uboot我就不碰了,主要是对

推荐文章

热门文章

相关标签