论坛首页 Java版 SOA

CXF 2.0 webservice 学习笔记系列_1

浏览 10488 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2007-08-03
对比了一下CXF2 和 AXIS 2 还是选择在框架中集成CXF2。不过CXF2的文档更新的真是慢啊,试了一下,目前CXF2支持的两种绑定方式jaxb2和aegis,看了半天源码总算调通了。又忍不住批一下他的文档,给的都是半调子的例子,希望开发小组能尽快完善啊!

先放一个HelloWold的aegis的配置:
一、server 端:
1. HelloWorld.java
package demo.spring;

import javax.jws.WebService;

@WebService
public interface HelloWorld {
    String sayHi(String text);
}


2.HelloWorldImpl.java
package demo.spring;

import javax.jws.WebService;

@WebService(endpointInterface = "demo.spring.HelloWorld")
public class HelloWorldImpl implements HelloWorld {

    public String sayHi(String text) {
        return "Hello " + text;
    }
}


3.beans.xml
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<bean id="jaxWsServiceFactoryBean"
		class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
		<property name="wrapped" value="true" />
		<property name="dataBinding" ref="aegisBean" />
	</bean>

	<bean id="aegisBean"
		class="org.apache.cxf.aegis.databinding.AegisDatabinding" />

	<jaxws:endpoint id="CollectiveServices"
		implementor="demo.spring.HelloWorldImpl" address="/HelloWorld">
		<jaxws:serviceFactory>
			<ref bean="jaxWsServiceFactoryBean"/>
		</jaxws:serviceFactory>
	</jaxws:endpoint>
</beans>


4.web.xml
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>WEB-INF/beans.xml</param-value>
	</context-param>

	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>

	<servlet>
		<servlet-name>CXFServlet</servlet-name>
		<servlet-class>
			org.apache.cxf.transport.servlet.CXFServlet
		</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>CXFServlet</servlet-name>
		<url-pattern>/ws/*</url-pattern>
	</servlet-mapping>

</web-app>


二、客户端

1.ClientTest.java
package demo.spring.client;

import static org.junit.Assert.assertEquals;

import org.apache.cxf.aegis.databinding.AegisDatabinding;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import demo.spring.HelloWorld;

public final class ClientTest {

	private static ClassPathXmlApplicationContext context;

	@BeforeClass
	public static void beforeClass() {
		context = new ClassPathXmlApplicationContext(
				new String[] { "demo/spring/client/client-beans.xml" });
	}

	@AfterClass
	public static void afterClass() {
		context = null;
	}

	@Test
	public void testSayHiWithSpringConfig() throws Exception {

		HelloWorld client = (HelloWorld) context.getBean("client");

		String response = client.sayHi("Joe");
		assertEquals("Hello Joe", response);
	}
	
	/**
	 * 这个官方有例子(http://cwiki.apache.org/CXF20DOC/aegis-databinding.html)
	 * 
	 * @throws Exception
	 */
	@Test
	public void testSayHiByCode() throws Exception {

		 ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
		 factory.setServiceClass(HelloWorld.class);
		 factory.setAddress("http://localhost:8080/testCxf/ws/HelloWorld");
		 factory.getServiceFactory().setDataBinding(new AegisDatabinding());
		 HelloWorld client = (HelloWorld) factory.create();

		 assertEquals("Hello Joe", client.sayHi("Joe"));
	}	
}



2.client_beans.xml(testSayHiWithSpringConfig()中需要使用的配置文件)

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schema/jaxws.xsd">

	
	<bean id="aegisBean"
		class="org.apache.cxf.aegis.databinding.AegisDatabinding" />
		
	<bean id="serviceFactoryBean" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
		<property name="dataBinding" ref="aegisBean" />
	</bean>

	<bean id="client" class="demo.spring.HelloWorld"
		factory-bean="clientFactory" factory-method="create" />

	<bean id="clientFactory"
		class="org.apache.cxf.frontend.ClientProxyFactoryBean">
		<property name="serviceFactory" ref="serviceFactoryBean" />
		<property name="serviceClass"
			value="demo.spring.HelloWorld" />
		<property name="address"
			value="http://localhost:8080/testCxf/ws/HelloWorld" />
	</bean>

</beans>
   
时间:2007-08-07
好文章,顶一下.

目前CXF确实的DataBinding是 JAXB,如果你不想使用 aegis binding而只想用JAXB, 可以跳过上面有关 aegisBean 的内容即可。

BTW,
如果你觉得CXF 的用户文档写得不好, 很简单你可以注册个账户,然后直接修改上面的内容。这也是wiki的最大好处 :)。
   
0 请登录后投票
时间:2007-08-09
能不能说说 CXF的异步调用

最好举个例子 讨论一下
   
0 请登录后投票
时间:2007-08-15
你的也不完整啊!
   
0 请登录后投票
时间:2007-08-15
CXF的生成和调用比Axis要方便哦
   
0 请登录后投票
时间:2007-08-22
苦闷ing...

看了一天CXF的How - to

两个例子都没调出来 达人们给建议吧

spring 那个是 跑在tomcat里
配置是
Client-bean.xml

[code] <bean id="client" class="demo.spring.HelloWorld" factory-bean="clientFactory" factory-method="create" /> <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="demo.spring.HelloWorld" /> <property name="address" value="http://localhost:8080/Restful" /> </bean> </beans> [/code]


Bean.xml
[code] <jaxws:endpoint id="helloWorld" implementor="demo.spring.HelloWorldImpl" address="/HelloWorld" /> [/code]
报下面的错误
org.apache.cxf.binding.soap.SoapFault: "null" is not a valid SOAP version.[code] 另外一个 Server没问题 但客户端跑不了 [code] private static final QName SERVICE_NAME = new QName("http://server.hw.demo/", "HelloWorld"); private static final QName PORT_NAME = new QName("http://server.hw.demo/", "HelloWorldPort"); private Client() { } public static void main(String args[]) throws Exception { Service service = Service.create(SERVICE_NAME); // Endpoint Address String endpointAddress = "http://localhost:9000/Restful"; // Add a port to the Service service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress); HelloWorld hw = service.getPort(HelloWorld.class); System.out.println(hw.sayHi("World")); } [/code]
报下面的错误

org.apache.cxf.interceptor.Fault: Could not send Message.
   
0 请登录后投票
时间:2007-08-23
Chamjoneu 写道
苦闷ing...

看了一天CXF的How - to

两个例子都没调出来 达人们给建议吧

spring 那个是 跑在tomcat里
配置是
Client-bean.xml

[code] <bean id="client" class="demo.spring.HelloWorld" factory-bean="clientFactory" factory-method="create" /> <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="demo.spring.HelloWorld" /> <property name="address" value="http://localhost:8080/Restful" /> </bean> </beans> [/code]


Bean.xml
[code] <jaxws:endpoint id="helloWorld" implementor="demo.spring.HelloWorldImpl" address="/HelloWorld" /> [/code]
报下面的错误
org.apache.cxf.binding.soap.SoapFault: "null" is not a valid SOAP version.[code] 另外一个 Server没问题 但客户端跑不了 [code] private static final QName SERVICE_NAME = new QName("http://server.hw.demo/", "HelloWorld"); private static final QName PORT_NAME = new QName("http://server.hw.demo/", "HelloWorldPort"); private Client() { } public static void main(String args[]) throws Exception { Service service = Service.create(SERVICE_NAME); // Endpoint Address String endpointAddress = "http://localhost:9000/Restful"; // Add a port to the Service service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress); HelloWorld hw = service.getPort(HelloWorld.class); System.out.println(hw.sayHi("World")); } [/code]
报下面的错误

org.apache.cxf.interceptor.Fault: Could not send Message.
你能否详细的说下你的例子吗?比如说Server,Client的.
你可以在cxf-user maillist[1] 或者cxf-user中文邮件组[2]来问你的问题.

[1]http://mail-archives.apache.org/mod_mbox/incubator-cxf-user/
[2]http://groups.google.com/group/cxf-zh
   
0 请登录后投票
时间:2007-08-23
interpb 写道
能不能说说 CXF的异步调用

最好举个例子 讨论一下


在CXF的samples里面有个hello_world_async例子,就是讲异步的.
你可以参考下..
   
0 请登录后投票
时间:2007-08-23
没用过CXF,问一下他和xFire 比起来有什么好处么?
   
0 请登录后投票
时间:2007-08-24
xfire只是一个soap堆栈, 而cxf是xfire和celtix合并的产物, 所以带来了很多内容, 比如jaxws实现, restful service, 等等

此外我们有中文论坛,欢迎加入 http://groups.google.com/group/cxf-zh
   
0 请登录后投票
论坛首页 Java版 SOA

跳转论坛:
JavaEye推荐