webservice(三) 使用JDK的EndPoint和cxf框架分别发布webservice服务

原创 2013年12月03日 14:58:35
在JDK1.6中JAX-WS规范定义了如何发布一个webService服务。
    JAX-WS是指Java Api for XML – WebService.
与web服务相关的是EndPoint类,此类为端点服务类,它提供一个publish方法用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。

使用jdk的EndPoint发布web服务

1.在要发布服务的类上添加@WebService注解。将要发布服务的方法设置为public。

2.调用EndPoint.publish(,)发布服务

其他注意事项:
1.给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布。
2.不支持静态方法,final方法。
3.如果希望某个方法(非static,非final)不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。
4.被添加了@WebService注解的类至少要有一个可以公开的方法,否则将会启动失败。

使用CXF框架发布服务

发布服务

两种方式发布服务:ServerFactoryBean 和JaxWsServerFactoryBean

JaxWsServerFactoryBean是ServerFactoryBean 的子类,也是功能扩展类。


1.ServerFactoryBean 方式

public class ServerFactoryBeanDemo {
	public String sayHi(String name){
		String s="hello "+name;
		return s;
	}
	
	public static void main(String[] args) {
		ServerFactoryBean sf=new ServerFactoryBean();
		//服务实现类
		sf.setServiceClass(ServerFactoryBeanDemo.class);
		//服务的发布地址
		sf.setAddress("http://localhost:5678/hello");
		//服务的实例
        sf.setServiceBean(new ServerFactoryBeanDemo());
        //发布服务
		sf.create();
		System.out.println("server ready……");
	}
}

ServerFactoryBean 方式

①不需要提供@WebService注解,依旧可以发布

②不需要提供对外暴露的方法,依旧可以发布(当然这也没什么意义)


2.JaxWsServerFactoryBean方式(建议使用)

@WebService
public class JaxWsServiceDemo {
	public String sayHi(String name) {
		String s = "hello " + name;
		return s;
	}

	public static void main(String[] args) {
		JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
		// 服务实现类
		sf.setServiceClass(JaxWsServiceDemo.class);
		// 服务的发布地址
		sf.setAddress("http://localhost:5678/hello");
		// 服务的实例
		sf.setServiceBean(new JaxWsServiceDemo());
		// 发布服务
		sf.create();
		System.out.println("server ready……");
	}
}

JaxWsServerFactoryBean方式

①需要提供@WebService注解

  虽然不提供该注解也可以发布成功,但是暴露的方法依旧无法显示,所以通常也会提供注解来显示暴露的方法。

  (可以通过查看wsdl文档来验证)


标准的做法
通常会提供一个服务接口,用以表明服务的类型。要加上@Webservice注解。这有点类似于Spring中的服务层的实现。

注意:不提供接口也行,但是在任何情况下都建议使用接口。

            如果使用spring的配置文件发布,则必须提供接口。

@WebService
public interface IHelloService {
	public String sayHi(String name);
}

然后提供一个实现类

public class HelloServiceImpl implements IHelloService{
	@Override
	public String sayHi(String name) {
		String s = "hello " + name;
		return s;
	}
	
	public static void main(String[] args) {
		JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
		// 服务的类型
		sf.setServiceClass(IHelloService.class);//注意:接口类型
		// 服务的发布地址
		sf.setAddress("http://localhost:5678/hello");
		// 服务的实现类实例
		sf.setServiceBean(new HelloServiceImpl());//注意:实现类实例
		// 发布服务
		sf.create();
		System.out.println("server ready……");
	}
}


wsdl2java工具

cxf也提供了一个用于生成客户端调用代码的工具wsdl2java.exe。它的功能同wsimport一样。它是可以支持SOAP1.1 和SOAP1.2的协议的。

此工具位于cxf_home/bin目录下。参数与wsimport有所不同。
它包含以下参数:
-d参数,指定代码生成的目录。
-p参数,指定生成的新的包结构。

注意:由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。

1、注意:由于使用的是apache-cxf-2.4.0版本,它是支持jdk1.7的。所以,对于生成的Service要进行稍微的修改。
   在jdk1.6中的javax.xml.ws.Service的构造方法接收二个参数为:(String url,QName qname);
   在jdk1.7中的javax.xml.ws.Service的构造方法中接收三个参数为:(String url,QName qname,features);


2、将生成的代码,拷贝到项目目录,然后使用以前相同方法调用。
    注意:如果将@WebMethod设置了header=true参数,将会在调用时多传递一个参数。参数可以直接传null值。
             对于这种情况,可以将header=true修改成header=false然后再重要获取客户端源代码。


3、可能发现,使用cxf生成的客户端代码与wsimport差不多,甚至是一样,那为什么还要使用cxf呢?
      原因:它较好的发布方式、较容易的与其他服务器集成、及与Spring的完美结合都不得不让我们使用cxf。

对于上面标准实现中的代码执行该命令,会生成代码供客户端使用。(用法类似于wsimport)



给服务添加消息拦截器

作用:类似于使用TCP/IP Monitor,用来捕获SOAP消息的过程。

LoggingInInterceptor – 信息输入时的拦截器 –请求
LoggingOutInterceptor –信息输出时的拦截器 - 响应

server.getInInterceptors().add(new LoggingInInterceptor());
server.getOutInterceptors().add(new LoggingOutInterceptor());

public class Server {
	public static void main(String[] args) {
		JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
		sf.setServiceClass(IHelloService.class);
		sf.setServiceBean(new HelloServiceImpl());
		sf.setAddress("http://localhost:5678/hello");

		// 加入请求的消息拦截器
		sf.getInInterceptors().add(new LoggingInInterceptor());
		// 加入响应的消息拦截器
		sf.getOutInterceptors().add(new LoggingOutInterceptor());
		sf.create();
		System.out.println("server ready……");
	}
}

可以在服务端控制台查看 拦截到的请求信息和发送给客户端的响应信息。



版权声明:本文为博主原创文章,版权归博主所有。如转载,请注明出处!

WebService 的一些基本概念-1 (Endpoint, Namespace,RPC/Document Type)

http://www.ttdev.com/SimpleService 这个webservice全名就是所谓的"endpoint"         RPC 型的Web Service 方法定义...

WebService服务的三种途径Endpoint Disco WSDL 有什么不同

Endpoint: http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx   web服务的URI地址,你访问之后,就会出现web服...
  • xieyufei
  • xieyufei
  • 2013年09月11日 17:00
  • 10079

关于webService提示An endpoint configuration...的问题

在silverlight中使用webService如果你两次以上删除同一个服务同时再添加该服务的情况下,程序在调试阶段会报错。错误提示为: An endpoint configuration sec...

调用webService的几种方式

调用WebService的几种方式

WebService 四种发布方式总结

WebService 四种发布方式总结 1. CXF方式 CXF与spring搭建webservice是目前最流行的方式,但是传闻cxf与jdk1.5有些不兼容,我没有遇到过,我遇到的问题...

CXF之使用CXF API 发布服务与进行客户端调用

使用CXF api发布服务 与 使用CXF api进行客户端调用 ,都是从jaxws API转到CXF api....
  • fhd001
  • fhd001
  • 2010年07月31日 17:49
  • 2039

CXF实现webService服务(一)

以前工作中也用CXF,但都是用别人现成搭好的环境,这次自己重头搭建一遍环境。过程中也有遇到的问题,也做了简单的整理。 对于CXF是干什么用的,我不想多说,大家都知道这是我们在java编程中webSe...

Spring4 + CXF3.1.5 RESTful Web Service 实战例子 (调试通过)

RESTful风格的webservice越来越流行了, sun也推出了RESTful WebService的官方规范:JAX-RS,全称:Java API for RESTful WebServic...

CXF3.0.2+Spring3.2.14 Web Service入门实例二

离上次学习CXF的时间比较长了,最近一直在忙别的项目,没有时间再继续学习CXF,也就没有再写博客了!马上就要2016年了,今天有点时间,再写一篇,把CXF3.0.7与spring3.2.14整合写出来...

cxf 3.0.3 与spring 3结合初探

近日发现有些服务只以打包的形式向他人提供先得有些不科学、不合理,于是便研究一下以webservice的方式提供服务。而webservice通常有两种开源方式,一种是axis,另一种是cxf。由于需要与...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:webservice(三) 使用JDK的EndPoint和cxf框架分别发布webservice服务
举报原因:
原因补充:

(最多只允许输入30个字)