您的位置:首页 > 编程语言 > Java开发

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注解对象绑定到一个地址的端口上。

使用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……");
}
}


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: