WebService-CXF发布javaSE项目


1、记得调整你的jdk版本为jdk1.6.0_24.

2、将所有cxfjar包拷贝到项目中来。添加到classpth中。

3、在开发之前可以先阅读CXF_HOME\lib\WATCH_JARS文件,分析jar文件之间的依赖关系。鉴于简单开发,所以直接都拷贝过来。

    (在我的项目当中已经去除了一些jar文件。)



CXF发布服务的类:

用两个不同的类发布应用:
ServerFactoryBean   -- FacotryBean
JaxWsServerFactoryBean(建议使用此类)

服务与客户端类调用原则:



使用ServerFactoryBean发布服务:



@WebService
/**
 * 通过@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)转换为实现SOAP1.2
 */
public interface IHelloService {

	public String sayHello(String name);
}

public class HelloServiceImpl implements IHelloService {

	public String sayHello(String name) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("sayHello()... name:" + name);
		return sdf.format(new Date()) + " hello " + name;
	}

}

/**
 * 
 * 使用JaxWsServerFactoryBean发布CXF的Web服务
 * 必须加入WebService注解,如果不加,虽然不报错,但是所有的方法都暴露不出来
 */

public class Server {

	public static void main(String[] args) {
		JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
		bean.setAddress("http://127.0.0.1:7788/hello");
		//提供服务的类的类型或接口类型
		bean.setServiceClass(IHelloService.class);
		bean.setServiceBean(new HelloServiceImpl());
		
		//加入请求的消息拦截器
		bean.getInInterceptors().add(new LoggingInInterceptor());
		//加入请求的消息拦截器
		bean.getOutInterceptors().add(new LoggingOutInterceptor());
		
		bean.create();
		System.out.println("Hello Service ready...");
	}
}

使用ClientProxyFactoryBean客户端调用:





public class Client {
	public static void main(String[] args) {
		ClientProxyFactoryBean bean = //创建客户端类
			new ClientProxyFactoryBean();
		//设置访问地址
		bean.setAddress("http://localhost:9999/one");
		//设置服务接口,直接使用本项目中的接口
		bean.setServiceClass(CxfOne.class);
		//通过create方法返回接口实例
		CxfOne s =   (CxfOne) bean.create();
		String str = s.sayHi();//调用
		System.err.println(str);
	}
}

使用JaxWsServerFactoryBean发布服务: (建议使用此类)



使用CXF的类发布一个服务:



/**
 * 使用JaxWsServerFactoryBean发布CXF的Web服务
 * 必须加入WebService注解,如果不加,虽然不报错,但是所有的方法都<b>暴露不出来<b>
 */

@WebService
public class HiService {
	
	public String sayHi(String name){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("sayHi()... name:" + name);
		return sdf.format(new Date()) + " hi " + name;
	}

	public static void main(String[] args) {
		JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
		//服务的地址
		bean.setAddress("http://127.0.0.1:6789/hi");
		//提供服务的类的类型
		bean.setServiceClass(HiService.class);
		//提供服务的实例
		bean.setServiceBean(new HiService());
		//发布服务  publish()...
		bean.create();
		System.out.println("server ready...");
	}
}

使用JaxWsProxyFactoryBean客户端调用

l 此调用过程与 ClientProxyFactoryBean 的要求一样,也必须要拥有一个接口。
l 此时,仍然可以使用 wsimport 生成接口,在其他项目的调用。


public class A {
public static void main(String[] args) {
//Cxf2Server t = 
//new Cxf2ServerService().getCxf2ServerPort();
//String s = t.sayHello();
//System.err.println(s);

JaxWsProxyFactoryBean bean = 
new JaxWsProxyFactoryBean();
bean.setAddress("http://localhost:9999/two");
//此外注册的必须是一个接口,否则将抛出异常信息
bean.setServiceClass(Cxf2Server.class);
Cxf2Server s = (Cxf2Server) bean.create();
System.err.println(s.sayHello());
}
}

wsdl2java生成客户代码:

在cxf中,也提供了一个用于生成客户端调用代码的工具。它的功能就如同wsimport一样。
先让我们了解一下cxf的wsdl2java工具,可以生成一堆客户端调用的代码。
此工具位于cxf_home/bin目录下。参数与wsimport有所不同。
它包含以下参数:
d参数,指定代码生成的目录。
p参数,指定生成的新的包结构。
需要说明的是,由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。
在命令行执行:

  wsdl2java –d .http://127.0.0.1:6666/helloworld?wsdl



1、注意:由于使用的是apache-cxf-2.4.0版本,它是支持jdk1.7的。所以,对于生成的Service要进行稍微的修改。

   在jdk1.6中的javax.xml.ws.Service的构造方法接收二个参数为:(Stringurl,QNameqname);

   jdk1.7中的javax.xml.ws.Service的构造方法中接收三个参数为:(Stringurl,QNameqname,features);

2、将生成的代码,拷贝到项目目录,然后使用以前相同方法调用。

    注意:如果你对@WebMethod设置了header=true参数,将会在调用时多传递一个参数。它参数可以直接传null值。

             对于这种情况,可以将header=true修改成header=false然后再重要获取客户端源代码。

3、大家可能发现了,使用cxf生成的客户端代码与wsimport差不多,甚至是一样,那为什么还要使用cxf呢?

它较好的发布方式、较容易的与其他服务器集成、及与Spring的完美结合都不得不让我们使用cxf

调用端代码:

1、必须已经使用wsimportwsdl2java生成了客户端代码。

以下是源代码:

/**

 * 使用java6来调用cxf生成的客户端类的服务

 * 不管是用wsimport还是用wsdl2java生成的类基本上是完全一样的

 */

public class App {
	public static void main(String[] args) {
		IHelloServiceService hss = new IHelloServiceService();
		IHelloService hs = hss.getIHelloServicePort();
		String ret = hs.sayHello("aa");
		System.out.println(ret);
	}
}

给服务添加消息拦截器:-这个非常有用:


public class Server {

	public static void main(String[] args) {
		JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
		bean.setAddress("http://127.0.0.1:7788/hello");
		//提供服务的类的类型或接口类型
		bean.setServiceClass(IHelloService.class);
		bean.setServiceBean(new HelloServiceImpl());
		
		//加入请求的消息拦截器
		bean.getInInterceptors().add(new LoggingInInterceptor());
		//加入请求的消息拦截器
		bean.getOutInterceptors().add(new LoggingOutInterceptor());
		
		bean.create();
		System.out.println("Hello Service ready...");
	}
}




总结:

l 如何通过 ant 发布第一个 cxf 应用。
l 手工建立一个 java 项目发布 cxf ws .
l Java 项目和 js 访问 webService
l 加入消息拦截器
l 将服务端改为 SOAP1.2 实现  
@WebService
@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)
/**
 * 通过@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)转换为实现SOAP1.2
 */
public interface IHelloService {

	public String sayHello(String name);
}

l SOAP1.1 1.2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值