关闭

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

1640人阅读 评论(0) 收藏 举报
分类:
在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……");
	}
}

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



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:74252次
    • 积分:2240
    • 等级:
    • 排名:第16876名
    • 原创:86篇
    • 转载:16篇
    • 译文:0篇
    • 评论:0条
    文章分类