`
log_cd
  • 浏览: 1098434 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

WebService之CXF处理类型转换

阅读更多
一、接口与实现
@WebService
@SOAPBinding(style=Style.RPC)
public interface IHelloWorld {

	public String sayHelloWorld(String name);
	
	public List<String> getStringList(List<String> strList);
	
	public List<User> getUserList(List<User> userList);
	
	@XmlJavaTypeAdapter(XMLMapAdapter.class)
	public Map<String,Object> getMapData(@XmlJavaTypeAdapter(XMLMapAdapter.class) Map<String,Object> data);
	
}

@Repository
@WebService(endpointInterface = "net.log_cd.ws.IHelloWorld")
public class HelloWorldImpl implements IHelloWorld {

	@Override
	public String sayHelloWorld(String name) {
		return "hi " + name + ", Hello World!";
	}

	@Override
	public List<String> getStringList(List<String> strList) {
		return strList;
	}

	@Override
	public List<User> getUserList(List<User> userList) {
		return userList;
	}

	@Override
	public Map<String, Object> getMapData(Map<String,Object> data) {
		return data;
	}

}

二、相关POJO
@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User implements Serializable{
	private static final long serialVersionUID = 1L;
	private String id;
	private String name;
	private String password;
	private Address address;
	
	@XmlJavaTypeAdapter(XMLTimestampAdapter.class)
	private Timestamp registerDate;
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Address getAddress() {
		return address;
	}

	public void setAddress(Address address) {
		this.address = address;
	}
	
	public Timestamp getRegisterDate() {
		return registerDate;
	}

	public void setRegisterDate(Timestamp registerDate) {
		this.registerDate = registerDate;
	}

	@Override
	public String toString(){
		return "ID:"+this.getId()+"-Name:"+this.getName()+"-Password:"+this.getPassword()
				+"-Address:"+this.getAddress().toString()+"-RegisterDate:"+this.getRegisterDate();
	}
	
}

public class Address implements Serializable {

	private static final long serialVersionUID = 1L;
	private String street;
	private String postcode;

	public String getStreet() {
		return street;
	}

	public void setStreet(String street) {
		this.street = street;
	}

	public String getPostcode() {
		return postcode;
	}

	public void setPostcode(String postcode) {
		this.postcode = postcode;
	}

	@Override
	public String toString(){
		return this.street+","+this.postcode;
	}
	
}

@XmlType(name = "MapConvertor")  
@XmlAccessorType(XmlAccessType.FIELD)  
public class MapConvertor {  
    private List<MapEntry> entries = new ArrayList<MapEntry>();  
  
    public void addEntry(MapEntry entry) {  
        entries.add(entry);  
    }  
  
    public List<MapEntry> getEntries() {  
        return entries;  
    }  
      
	public static class MapEntry {  
 
        private String key;  
  
        private Object value;  
          
        public MapEntry() {  
            super();  
        }  
  
        public MapEntry(String key, Object value) {  
            super();  
            this.key = key;  
            this.value = value;  
        }  
  
        public String getKey() {  
            return key;  
        }  
  
        public void setKey(String key) {  
            this.key = key;  
        }  
  
        public Object getValue() {  
            return value;  
        }  
  
        public void setValue(Object value) {  
            this.value = value;  
        }  
    }  
}  

三、类型转换适配器
/**
 * adapter: Timestamp to String
 */
public class XMLTimestampAdapter extends XmlAdapter<String, Timestamp>{

	private static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
	
	@Override
	public String marshal(Timestamp time) throws Exception {
		Date date = new Date(time.getTime());
		return new SimpleDateFormat(DEFAULT_FORMAT).format(date);
	}

	@Override
	public Timestamp unmarshal(String timeStr) throws Exception {
		Date date = new SimpleDateFormat(DEFAULT_FORMAT).parse(timeStr);
		return new Timestamp(date.getTime());
	}

}

/**
 * 通过继承XmlAdapter<ValueType,BoundType>类型,将CXF不能处理的类型进行转换
 * valuType是能够处理的类型,boundType是不能处理的类型:
 * 转化的实质是将不能处理的类型,如Map,定义一个类来模拟Map。
 */
public class XMLMapAdapter extends XmlAdapter<MapConvertor, Map<String, Object>> {

	@Override
	public MapConvertor marshal(Map<String, Object> map) throws Exception {
		MapConvertor convertor = new MapConvertor();  
        for (Map.Entry<String, Object> entry : map.entrySet()) {  
            MapConvertor.MapEntry e = new MapConvertor.MapEntry(entry.getKey(), entry.getValue());  
            convertor.addEntry(e);
        }  
        return convertor; 
	}

	@Override
	public Map<String, Object> unmarshal(MapConvertor map) throws Exception {
		Map<String, Object> result = new HashMap<String, Object>();  
        for (MapConvertor.MapEntry e : map.getEntries()) {  
            result.put(e.getKey(), e.getValue());  
        }  
        return result;  
	}

}

四、发布WebService
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.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-servlet.xml" />

	<context:component-scan base-package="net.log_cd.ws"/>
	
	<jaxws:server id="helloWorldWebService" serviceClass="net.log_cd.ws.IHelloWorld"
	     address="/helloWorld">
	    <jaxws:serviceBean>
	        <ref bean="helloWorldImpl"/>
	    </jaxws:serviceBean>
	</jaxws:server>
	
</beans>

五、配置spring客户端
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	<context:component-scan base-package="com.log_cd.ws" />

	<!-- org.apache.cxf.bus.spring.SpringBus: under bean name 'cxf' just bound one -->
	<jaxws:client id="helloClient" serviceClass="net.log_cd.ws.IHelloWorld"
		address="http://localhost:8080/cxf/ws/helloWorld" />

</beans>

六、测试代码
@ContextConfiguration("classpath:cxf-ws-client.xml")
public class CXFWebServiceTest extends AbstractJUnit4SpringContextTests {

	@Resource
	private IHelloWorld helloClient;

	@Ignore
	public void testInvokeWithJaxWsProxyFactory() {
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(IHelloWorld.class);
		factory.setAddress("http://localhost:8080/cxf/ws/helloWorld");
		IHelloWorld service = (IHelloWorld) factory.create();
		System.out.println(service.sayHelloWorld("JaxWsProxyFactory"));
	}

	@Ignore
	public void testInvokeFromApplicationContext() {
		System.out.println(helloClient.sayHelloWorld("ApplicationContext"));
	}

	@Ignore
	public void testStringList() {
		List<String> strList = new ArrayList<String>();
		strList.addAll(Arrays.asList("lucy,lily,frank,steve".split(",")));
		List<String> retStrList = helloClient.getStringList(strList);
		for (String str : retStrList) {
			System.out.println(str);
		}
	}

	@Ignore
	public void testUserList() {
		List<User> userList = new ArrayList<User>();
		for (int i = 1; i <= 10; i++) {
			User user = new User();
			user.setId("" + i);
			user.setName("user_" + i);
			user.setPassword("password_" + i);
			user.setRegisterDate(new Timestamp(System.currentTimeMillis()));
			Address address = new Address();
			address.setStreet("street_" + i);
			address.setPostcode(String.valueOf(Math.round((Math.random() * 1000000f))));
			user.setAddress(address);

			userList.add(user);
		}
		List<User> retList = helloClient.getUserList(userList);
		for (User user : retList) {
			System.out.println(user.toString());
		}
	}

	@Test
	public void testMapData() {
		Map<String, Object> data = new HashMap<String, Object>();
		data.put("name", "vajra");
		data.put("weight", "70KG");
		data.put("height", "165cm");
		data.put("descript", "fat man");		
		Map<String, Object> retMap = helloClient.getMapData(data);
		for (Map.Entry<String, Object> entry : retMap.entrySet()) {
			System.out.println(entry.getKey() + "=" + entry.getValue());
		}
	}

}
分享到:
评论

相关推荐

    WebService CXF 对象传递 附

    - **反序列化**:同样,服务方法返回的对象也会被CXF转换为XML,然后发送回客户端。 5. **JAXB的使用** - **注解Java类**:使用`@XmlRootElement`注解标记Java类,使其可作为XML根元素,如: ```java @...

    webservice使用cxf的实例

    这些组件协同工作,处理服务的生命周期、消息传递和协议转换。 3. **创建Web服务**:使用CXF,你可以通过简单的注解在Java类上定义服务接口和实现。例如,使用`@WebService`注解声明一个服务接口,`@WebMethod`注解...

    WebService_CXF范例.

    【WebService CXF详解与入门】 WebService是一种允许不同系统之间进行通信和交互的标准协议,它基于HTTP协议,使得应用程序可以无视具体实现细节地调用互联网上的服务。这种技术使得分布式应用程序的发展成为可能,...

    WebService CXF 详细教程

    **WebService CXF 详解** **一、WebService简介** WebService是一种基于标准的,可以在不同操作系统、编程语言之间交换数据的Web应用程序。它通过WSDL(Web服务描述语言)定义了服务接口,利用SOAP(简单对象访问...

    WebService之CXF开发指南.rar

    **WebService之CXF开发指南** 在IT行业中,WebService是一种基于开放标准(如WSDL、SOAP和UDDI)的通信协议,它允许不同系统之间进行互操作性交互。CXF,全称Apache CXF,是一个开源的Java框架,用于构建和开发高...

    webservice-cxf-2.3.5

    CXF 支持 JAXB(Java Architecture for XML Binding)和 Aegis 来进行对象到 XML 和 XML 到对象的转换,简化了数据交换过程。 6. **传输协议和绑定**: - HTTP/HTTPS:CXF 支持标准的 HTTP 和安全的 HTTPS 协议。...

    webservice cxf_demo

    【标题】"webservice cxf_demo" 涉及到的是使用Apache CXF框架创建的Web服务示例项目。在Web服务的世界里,CXF是一个流行的开源工具,它支持SOAP和RESTful风格的服务,用于构建和消费Web服务。这个"CXF_demo"很可能...

    webservice cxf.jar 相关包

    4. 编码解码:CXF支持多种数据绑定技术,如JAXB(Java Architecture for XML Binding)和Aegis,用于XML与Java对象之间的转换。 5. 安全性:通过WSS,CXF提供了一套完整的安全解决方案,包括基本认证、数字签名、...

    WebService_CXF实现及ANT

    在这个主题中,我们将深入探讨CXF的Interceptor拦截器、处理复杂类型对象的传递以及如何结合Spring进行集成,最后我们将学习如何使用ANT工具快速构建和部署CXF工程。 1. CXF Interceptor拦截器: 拦截器是CXF框架...

    WebService_CXF学习

    【WebService_CXF学习】系列主要关注的是Java平台上的Web服务实现,特别是JAX-WS规范和CXF框架的应用。JAX-WS(Java API for XML Web Services)是一种用于构建和部署XML Web服务的API,它使得开发者能以简单的方式...

    CXF实现webservice

    - **数据绑定**:CXF支持JAXB(Java Architecture for XML Binding)进行对象到XML的自动转换。 - **安全**:通过WS-Security,CXF可以实现基于证书的身份验证和消息加密。 - **拦截器**:可以自定义拦截器来处理...

    CXF WebService实例

    从简单的"HelloWorld"到处理复杂数据类型,再到文件的上传和下载,CXF提供了全面的支持。通过这个"CXF WebService实例",开发者可以深入理解如何利用CXF实现各种Web服务功能,并将其应用于实际项目中。

    WebService之CXF(二、客户端的生成与调用)

    这篇博客文章“WebService之CXF(二、客户端的生成与调用)”将深入探讨如何使用CXF来创建和调用Web服务客户端。下面我们将详细解析这一主题。 首先,了解CXF的基本概念至关重要。CXF不仅支持SOAP(简单对象访问...

    webservice(CXF)

    CXF允许开发者以他们熟悉的编程模型(如JavaBeans或JAX-RS)来编写服务,然后自动将其转换为SOAP或RESTful WebService。CXF不仅支持SOAP 1.1/1.2,还支持WS-*(如WS-Security, WS-ReliableMessaging等)标准,以及...

    WebService开发客户端 cxf方式

    1. **数据绑定**:CXF支持JAXB(Java Architecture for XML Binding)进行数据绑定,可以将XML数据自动转换为Java对象,反之亦然,简化了数据处理。 2. **安全性**:CXF提供多种安全机制,如SSL/TLS加密、WS-...

    webservice的cxf框架客户端调用所需jar包

    这些JAR包包含了CXF框架的核心组件、XML处理库、数据序列化工具、缓存机制、消息队列通信以及Spring框架的支持。 1. `cxf-core-3.2.4.jar`: 这是CXF的核心模块,包含了处理SOAP消息、WSDL定义解析、服务实例化等...

    07.处理Map等CXF无法自动转换的复合数据类型的形参和返回值

    本文将详细探讨如何处理Map等CXF无法自动转换的复合数据类型的形参和返回值,这对于提升服务功能和用户体验至关重要。 首先,我们需要理解CXF的工作原理。CXF提供了一种直观的方式来创建和消费Web服务,它通过Java...

    使用CXF和camel-cxf调用webservice

    通过使用camel-cxf,你可以利用Camel的灵活性和路由能力来处理Web服务的调用和响应。 在camel-cxf中,你可以: 1. **定义路由**:使用Camel的DSL(Domain Specific Language)或者XML配置文件,定义从何处获取输入...

    springboot+webservice+cxf

    为了支持不同数据类型的传输,例如JSON字符串,我们可以使用CXF的JAXB绑定,将对象自动转换为XML或JSON格式。此外,CXF还支持MTOM(Message Transmission Optimization Mechanism)和SwA(Swapped Attachments)来...

Global site tag (gtag.js) - Google Analytics