maven构建第一个cxf项目以及分析

本次主要讨论用maven构建第一个cxf项目,以及各个类的含义以及方法,并且简单分析wsdl的内容。如需转载,请标明转载地址,谢谢。


   首先,在Eclipse中用maven构建一个quickstart版本的maven项目,并且在pom文件中添加4个依赖,分别是:cxf-rt-frontend-jaxws、cxf-rt-databinding-aegis、cxf-rt-transports-http、cxf-rt-transports-http-jetty,在本次测试时用的版本都是2.5.2,在笔者测试时最高版本升级为2.6.2。以下为本次项目的pom文件中的依赖:
	<dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>2.5.2</version>
    </dependency>
   	<dependency>
		<groupId>org.apache.cxf</groupId>
		<artifactId>cxf-rt-databinding-aegis</artifactId>
		<version>2.5.2</version>
	</dependency>
	<dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>2.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>2.5.2</version>
    </dependency>


第一步,建立HelloWorld接口,此处的Document应该为W3C的文档形式。
public interface HelloWorld {
	String sayHi(String text);
	Document getADocument();
}

第二步,建立HelloWorld的实现类HelloWorldImpl。
public class HelloWorldImpl implements HelloWorld{

	public String sayHi(String text) {
		System.out.println("sayHi called");
        return "Hello " + text;
	}

	public Document getADocument() {
		DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = null;
		try {
			db = dbfac.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
		Document doc =db.newDocument();
		Element carrot = doc.createElement("carrot");
		doc.appendChild(carrot);
		carrot.appendChild(doc.createTextNode("Carrots are roots"));
		return doc;
	}
	
}

DocumentBuilderFactory:该类是一个解析器的工厂,包含的解析器可以在XML文档产生一个DOM对象树,是一个工厂类。
DocumentBuilder : 该API在XML文档中包含DOM文档实例。

第三步,建立服务类Server。
	HelloWorldImpl hwi = new HelloWorldImpl();
		ServerFactoryBean fac = new ServerFactoryBean();
		fac.setServiceClass(HelloWorld.class);
		fac.setAddress("http://localhost:8899/hello");
		fac.setServiceBean(hwi);
		fac.getServiceFactory().setDataBinding(new AegisDatabinding());
		fac.create();
        System.out.println("Server ready...");

        Thread.sleep(5 * 60 * 1000);
        System.out.println("Server exiting");
        System.exit(0);
	}


该服务首先创建一个服务工厂,然后通过服务工厂设置服务类、服务地址、服务实体,同时把这些服务的参数绑定到该服务中,同时设置一个线程来控制服务启动的时间为1分钟,有效的控制了端口占用问题。

第三步,创建客户端
ClientProxyFactoryBean cfac = new ClientProxyFactoryBean();
		if(args != null && args.length>0 && !"".equals(args[0])){
			cfac.setAddress(args[0]);
		}else{
			cfac.setAddress("http://localhost:8899/hello");
		}
		cfac.getServiceFactory().setDataBinding(new AegisDatabinding());
		HelloWorld client = cfac.create(HelloWorld.class);
		System.out.println(client.sayHi(System.getProperty("user.name")));
		
		System.out.println("------------------------------");
		Document doc = client.getADocument();
		Element e = (Element) doc.getFirstChild();
		System.out.println(e.getTagName());
		Text t = (Text) e.getFirstChild();
		
		System.out.println(t);
	}


首先获得客户端代理工厂类,通过该类来获绑定务中信息,客户端的服务地址必须和服务端的地址相同,否则无法访问。

   到此为止,我们已经成功的书写好了所需要的代码,然后运行server,此处server的启动时间为1分钟,所以在一分钟之类运行客户端,看到如下结果:
Hello Administrator
------------------------------
carrot
[#text: Carrots are roots]

本次测试附带源码,读者可以下载。




       

你可能感兴趣的:(maven,CXF)