webservice(三) 使用JDK的EndPoint和cxf框架分别发布webservice服务
2013-12-03 14:58
731 查看
在JDK1.6中JAX-WS规范定义了如何发布一个webService服务。
JAX-WS是指Java Api for XML – WebService.
与web服务相关的是EndPoint类,此类为端点服务类,它提供一个publish方法用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。
2.调用EndPoint.publish(,)发布服务
其他注意事项:
1.给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布。
2.不支持静态方法,final方法。
3.如果希望某个方法(非static,非final)不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。
4.被添加了@WebService注解的类至少要有一个可以公开的方法,否则将会启动失败。
两种方式发布服务:ServerFactoryBean 和JaxWsServerFactoryBean
JaxWsServerFactoryBean是ServerFactoryBean 的子类,也是功能扩展类。
![](http://img.blog.csdn.net/20131203145331984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF2YW5kcm9pZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
ServerFactoryBean 方式
①不需要提供@WebService注解,依旧可以发布
②不需要提供对外暴露的方法,依旧可以发布(当然这也没什么意义)
JaxWsServerFactoryBean方式
①需要提供@WebService注解
虽然不提供该注解也可以发布成功,但是暴露的方法依旧无法显示,所以通常也会提供注解来显示暴露的方法。
(可以通过查看wsdl文档来验证)
标准的做法
通常会提供一个服务接口,用以表明服务的类型。要加上@Webservice注解。这有点类似于Spring中的服务层的实现。
注意:不提供接口也行,但是在任何情况下都建议使用接口。
如果使用spring的配置文件发布,则必须提供接口。
然后提供一个实现类
此工具位于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)
![](http://img.blog.csdn.net/20131203165340484?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamF2YW5kcm9pZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
LoggingInInterceptor – 信息输入时的拦截器 –请求
LoggingOutInterceptor –信息输出时的拦截器 - 响应
server.getInInterceptors().add(new LoggingInInterceptor());
server.getOutInterceptors().add(new LoggingOutInterceptor());
可以在服务端控制台查看 拦截到的请求信息和发送给客户端的响应信息。
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……"); } }
可以在服务端控制台查看 拦截到的请求信息和发送给客户端的响应信息。
相关文章推荐
- Spring 集成CXF框架发布Webservice服务 和 使用jdk生成Webservice clinet
- 使用CXF框架,发布webservice服务,并使用客户端远程访问webservice
- 服务使用CXF框架客户端使用Axis2框架的webservice实现方案
- WebService服务发布与使用(JDK自带WebService)
- JAVA项目中发布WebService服务——使用jdk
- 使用CXF(JaxWsServerFactoryBean、ServerFactoryBean)编码的方式发布WebService服务
- 使用CXF框架发布SOAP格式的webservice
- 利用resteasy框架构建rest webservice----第二波:使用不同的方式让resteasy发布我们的restful webservice 服务(实例、教程)
- WebService基础课程之使用CXF发布javase服务
- WebService系列二:使用JDK和CXF框架开发WebService
- 使用Cxf发布Webservice服务,如果待发布的接口中有重载方法,怎么处理??
- 使用CXF发布webservice服务及注意要点
- 使用Spring + CXF 发布WebService服务
- jdk1.6.0.10版本下使用jaxws发布webservice服务
- WebService的CXF框架与Spring的整合发布服务入门
- CXF框架学习,发布webservice服务
- 使用CXF框架发布webservice
- 使用cxf,spring,mybatis框架完成restful风格的webservice服务
- 利用resteasy框架构建rest webservice----第二波:使用不同的方式让resteasy发布我们的restful webservice 服务(实例、教程)
- 使用Cxf发布Webservice服务,如果待发布的接口中有重载方法,怎么处理??[转]