webservice(三) 使用JDK的EndPoint和cxf框架分别发布webservice
在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文档来验证) 标准的做法 注意:不提供接口也行,但是在任何情况下都建议使用接口。 ? ? ? ? ? ? 如果使用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有所不同。 注意:由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。 ? ?在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 – 信息输入时的拦截器 –请求 server.getInInterceptors().add(new LoggingInInterceptor());
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……"); } } 可以在 服务端控制台查看 拦截到的请求信息和发送给客户端的响应信息。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |