`
ll_feng
  • 浏览: 389311 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

cxf学习笔记之传递附件

    博客分类:
  • j2ee
 
阅读更多
cxf是jws的实现,上传二进制文件主要借助MTOM来实现,只须在发布服务时进行简单的配置即可。

一、服务端
先建web工程
1、创建包括附件的复杂对象
package cn.ibeans.ws.pojo;

import javax.activation.DataHandler;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlMimeType;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
	private String name;
	private String sex;
	@XmlMimeType("application/octet-stream")		//注意,必不可少
	private DataHandler photo;
	/*public Person(String name, String sex) {
		super();
		this.name = name;
		this.sex = sex;
	}*/
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	public DataHandler getPhoto() {
		return photo;
	}
	public void setPhoto(DataHandler photo) {
		this.photo = photo;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", sex=" + sex + "]";
	}
	
}



2、创建web服务接口
package cn.ibeans.ws;

import java.util.List;

import javax.jws.WebService;

import cn.ibeans.ws.pojo.Person;

/**
 * 设计一个人员报名的web服务,人员信息是一个复杂对象。
 * 服务端接收该对象后进行必要的处理,并将报名结果回传客户端
 * @author llf
 *
 */
@WebService
public interface RegisterWebService {
	public String toRegister(Person person);
	
	public String toBatchRegister(List<Person> persons);
}

3、创建web服务接口的实现类
package cn.ibeans.ws.impl;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.activation.DataHandler;
import javax.jws.WebService;

import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

import cn.ibeans.ws.RegisterWebService;
import cn.ibeans.ws.pojo.Person;

/**
 * @author llf
 *
 */
@WebService(endpointInterface="cn.ibeans.ws.RegisterWebService")
public class RegisterWebServiceImpl implements RegisterWebService {

	@Override
	public String toRegister(Person person) {
		if(person!=null){
			System.out.print("注册信息是:"+person);
			
			//处理附件
			DataHandler data = person.getPhoto();
			try {
				//定义客户端上传的附件在服务器的存储路径和名称
				String path = this.getClass().getResource("/").getPath();	//类路径(classes)在服务器上约绝对地址
				System.out.println(":"+path);
				
				WebApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext();//获得web应用的上下文对象			
				String root = ctx.getServletContext().getRealPath("/");		//获得web应用在服务器的根路径的绝对地址
				root+="upload";
				File f = new File(root,person.getName()+".png");
				
				//进行流操作,将附件写到服务器硬盘
				InputStream is = data.getInputStream();
				OutputStream os = new FileOutputStream(f);
				byte[] bytes = new byte[1024];
				int len = 0;
				while((len=is.read(bytes))>0){
					os.write(bytes, 0, len);
				}
				is.close();
				os.close();
				
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return person.getName();
	}

	@Override
	public String toBatchRegister(List<Person> persons) {
		if(persons!=null){
			for(Person person:persons){
				System.out.println(person);
			}
		}
		return "ok";
	}
}



4、在spring中配置web服务
<?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:p="http://www.springframework.org/schema/p"  
    xmlns:jaxws="http://cxf.apache.org/jaxws"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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-extension-soap.xml" />  
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />   
     
    <jaxws:endpoint id="register"  implementor="cn.ibeans.ws.impl.RegisterWebServiceImpl" address="/ws/register">
    	<jaxws:properties>
    		<entry key="mtom-enabled" value="true"/>	<!--注意:传递附件的必须配置-->
    	</jaxws:properties>
    </jaxws:endpoint>
    
</beans>

4、发布web服务
启动web应用,并测试

二、客户端
1、创建web服务接口在客户端的副本和用来传递DTO对象
可以通过wsdl2java,如果有条件了可直接从服务端copy过来

package cn.ibeans.ws;

import javax.activation.DataHandler;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlMimeType;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for person complex type.
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
//@XmlType(name = "person", propOrder = {"name", "sex"})
public class Person {

    protected String name;
    protected String sex;
    @XmlMimeType("application/octet-stream")	//注意,传递附件的必要配置
    private DataHandler photo;


    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String value) {
        this.sex = value;
    }

	public DataHandler getPhoto() {
		return photo;
	}

	public void setPhoto(DataHandler photo) {
		this.photo = photo;
	}
}



package cn.ibeans.ws;

import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebService;

/**
 * This class was generated by Apache CXF 2.3.0
 * Tue Jan 10 12:58:50 CST 2012
 * Generated source version: 2.3.0
 * 
 */
 
@WebService(targetNamespace = "http://ws.ibeans.cn/", name = "RegisterWebService")
//@XmlSeeAlso({ObjectFactory.class})
public interface RegisterWebService {

    public java.lang.String toRegister(@WebParam(name = "arg0", targetNamespace = "") cn.ibeans.ws.Person arg0);
    
    public String toBatchRegister(List<Person> persons);
}


3、调用web服务,上传递附件
写一个JUnit类,测试一下:
/**
 * 
 */
package cn.ibeans.test.ws.client;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;

import junit.framework.Assert;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Before;
import org.junit.Test;

import cn.ibeans.ws.Person;
import cn.ibeans.ws.RegisterWebService;


/**
 * @author llf
 *
 */
public class RegisterWSTest {

	private JaxWsProxyFactoryBean factory;
	private Person person;
	private List<Person> persons;
	@Before
	public void setUp() throws Exception {
		factory = new JaxWsProxyFactoryBean();
	}
	@Test
	public void testRegister(){
		factory.setServiceClass(RegisterWebService.class);
		factory.setAddress("http://localhost:9090/cxfServer/ws/register");
		//以下三行设置客激活mtom功能,必不可少,
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("mtom-enabled", true);
		factory.setProperties(map);
		
		RegisterWebService client = (RegisterWebService)factory.create();	//若没有上面三行,此处创建不成功
		//以上语句的功能 可以通过spring来实现
		person = new Person();
		person.setName("zhangsan");
		person.setSex("man");
		DataSource ds = new FileDataSource(new File("D://wsdl.png"));//注意!
		person.setPhoto(new DataHandler(ds));	//
		
		String result = client.toRegister(person);
		System.out.println("web service调用结果是:"+result);
		Assert.assertEquals("zhangsan", result);
	}
}



4、就是测试了,运行测试类,会发现服务调用成功。检查web工程下的upload目录,查看服务是否传递过来了。

三、注意事项
1、服务端和客户端的数据对象中,用来存储附件的属性都要用“@XmlMimeType("application/octet-stream")”进行注解,如下:
@XmlMimeType("application/octet-stream")
private DataHandler photo;


2、服务端和客户端的web服务配置都要声明mtom-enabled=true
服务端如果在spring中配置,如下:
<jaxws:endpoint id="register"  implementor="cn.ibeans.ws.impl.RegisterWebServiceImpl" address="/ws/register">
    <jaxws:properties>
    	<entry key="mtom-enabled" value="true"/>	
    </jaxws:properties>
</jaxws:endpoint>


客户端,如果用代码配置(也可用spring配置,类似服务端),如下:
Map<String,Object> map = new HashMap<String,Object>();
map.put("mtom-enabled", true);
factory.setProperties(map);
分享到:
评论

相关推荐

    超详细CXF学习笔记

    WebService的实现——CXF学习笔记

    【WebService的实现——CXF学习笔记】 在Java世界中,WebService是一种通过标准协议(如SOAP)进行跨平台、跨语言通信的技术。CXF是Apache软件基金会的一个开源项目,它提供了构建和消费Web服务的工具和库。CXF支持...

    CXF学习笔记.docx )

    CXF(CXF: Composite eXtensible Framework)是一个开源的Java框架,它主要用于构建和服务导向架构(Service-Oriented Architecture, SOA)中的Web服务。CXF允许开发者通过多种方式来创建和消费Web服务,无论是基于...

    cxf学习笔记之结合spring创建客户端

    在IT行业中,CXF是一个广泛使用的开源框架,用于构建和服务导向架构(SOA)的应用程序。本篇将探讨如何结合Spring框架创建一个CXF客户端,从而实现服务的调用。首先,我们需要理解CXF和Spring的基本概念。 **CXF** ...

    Apache_cxf_学习笔记

    本学习笔记旨在提供对Apache CXF的基本理解、功能特性和实际操作指导。 **1. CXF 简介** 1.1 CXF概述 Apache CXF是一个全面的服务开发框架,它允许开发者创建和部署各种类型的Web服务,包括基于SOAP、RESTful、WS-...

    Apache cxf 学习笔记.pdf

    Apache CXF 是一个开源的Java框架,它主要用于构建和开发服务导向架构(Service-Oriented Architecture, SOA)的应用程序。...通过深入学习和实践,开发者可以充分利用CXF的优势,提高软件开发的效率和质量。

    Axis2,CXF版本学习笔记

    当我们谈论“Axis2,CXF版本学习笔记”时,这通常涉及到两个主要的Java Web服务框架:Apache Axis2和Apache CXF。这两个框架都用于构建和部署SOAP(简单对象访问协议)和RESTful(Representational State Transfer)...

    WebService CXF 对象传递 附

    **WebService CXF 对象传递详解** 在Web服务领域,CXF是一个非常重要的开源框架,它允许开发者创建和消费各种Web服务。CXF支持SOAP、RESTful等多种通信模式,并且能够处理复杂的对象传递,使得Web服务的数据交换...

    WebService CXF学习文档

    WebService CXF学习——入门篇 1.CXF由来 2.HelloWorld 3.WSDL描述 WebService CXF学习——进阶篇 1.SOAP讲解 2.JAX-WS讲解 3.对象传递 WebService CXF学习——高级篇(一)(二) 1.整合Spring框架 2.CXF...

    CXF的学习笔记

    CXF 包含了大量的功能特性,但是主要集中在以下几个方面: 支持 Web Services 标准:CXF 支持多种 Web Services 标准,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。...

    Apache_cxf_学习笔记.docx

    ### Apache CXF 学习笔记知识点汇总 #### 一、CXF简介 ##### 1.1 CXF概述 - **背景介绍**:Apache CXF 是一个高性能、功能丰富的开源框架,用于构建和消费 Web 服务。它融合了 Celtix 和 XFire 两个开源项目的...

    webservice+cxf基础笔记和视频,

    总的来说,这份“webservice+cxf基础笔记和视频”资源将引导你进入Web服务的世界,通过学习和实践,你可以掌握使用CXF和Spring进行Web服务开发的基本技能。无论你是初学者还是有一定经验的开发者,这都将是一份有...

    cxf3.0 spirng 集成笔记

    在本文中,我们将探讨如何将Apache CXF 3.0.2版本集成到Spring框架中,以及在这个过程中可能遇到的问题和解决方案。Apache CXF是一个开源的SOA(Service-Oriented Architecture)框架,它允许开发人员创建和消费各种...

    Apache-cxf-学习笔记.docx

    Apache CXF是一个强大的开源Web服务框架,源自Celtix和XFire两个项目的合并,现在作为Apache软件基金会的顶级项目存在。...无论是新手还是经验丰富的开发者,都可以通过CXF的学习和实践,提升Web服务开发的效率和质量。

    Cxf应用整理学习资料

    ### CXF应用整理学习资料详解 #### 一、CXF简介与HelloWorld示例 Apache CXF是一个开源的框架,用于构建和消费基于SOAP、XML、REST等协议的Web服务。CXF支持JAX-WS和JAX-RS标准,为Java开发人员提供了丰富的API,...

    apache—CXF学习文档

    本学习文档将深入探讨CXF的核心特性、使用场景以及如何进行实际操作。 **1. CXF 简介** 1.1 CXF概述 Apache CXF,原名为XFire,是一个用于构建和服务消费的开源框架。它允许开发者以Java编程模型来创建和调用Web...

    webservice cxf 服务端客户端传递参数的例子demo

    总结,这个例子是一个很好的学习资源,它覆盖了CXF框架下Web服务端和客户端的创建、参数传递、测试等核心知识点。对于初学者而言,通过实践这个demo,可以深入理解Web服务的工作原理,以及CXF框架的使用方式。在实际...

    CXF 学习小例子

    这个压缩包包含了一个实际的CXF示例项目以及作者的学习笔记,可以帮助我们深入理解CXF的工作原理和使用方法。 在【描述】中提到,这个例子是一个CXF的demo,它展示了如何通过CXF创建和运行Web服务。CXF支持多种协议...

Global site tag (gtag.js) - Google Analytics