基于spring+cxf实现用户文件传输的webservice

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于spring+cxf实现用户文件传输的webservice

1 引言

在EDI系统中,用户数量较多,并且信息化水平差距较大,所以对报文的收发方式具有多样化的需求。相对其他访问方式而言,http(s)的访问在防火墙限制、安全性等方面都有较好表现。因此,有相当部分用户提出通过webservice发送报文的需求。本文介绍了如何采用cxf 结合spring框架实现具有文件上传和相关查询功能的webservice,以便其在使用.net或其他框架开发的MIS系统中能够自动生成报文并上传。同时,该webservice还提供了用户基本身份验证功能,对访问请求进行限制。

Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。

2.功能分析

(1)该webservice需要提供报文上传到服务器上的基本功能。

(2)用户可以查询已经发送的报文历史信息列表,包括报文名称、报文大小和发送时间。

(3)由于不是开放服务,所以还需要对用户身份进行基本认证。

3.服务构建

(1)定义要提供的服务接口

首先要定义webservice输入输出的数据类型,主要包括报文名称、报文类型、报文发送时间以及处理文件流的DataHandler属性。代码片段如下:

public class MsgItem

{

//报文名称

private String filename;

//报文类型

private String filetype;

//传输时间

private String trans_time;

//文件流指针

private DataHandler msgfile;

public String getFilename()

{

return filename;

}

public void setFilename(String filename)

{

this.filename = filename;

}

public String getFiletype()

{

return filetype;

}

public void setFiletype(String filetype)

{

this.filetype = filetype;

}

public String getTrans_time()

{

return trans_time;

}

public void setTrans_time(String trans_time) {

this.trans_time = trans_time;

}

public DataHandler getMsgfile()

{

return msgfile;

}

public void setMsgfile(DataHandler msgfile)

{

this.msgfile = msgfile;

}

}

在定义好输入输出的数据结构后,就可以定义要提供的业务服务接口。在该接口中使用@WebService注释来声明接口名称和命名空间,使用@WebResult注释来声明返回变量名称,使用@WebParam注释来声明传入变量名称,代码片段如下:

/**

*报文上传服务接口

*/

@WebService(name = "MsgTrans", targetNamespace =

"/com/test/busw/service/file")

public interface MsgTrans

{

/**

* 上传报文

* @param item 报文实例

* @return报文上传结果消息

*/

@WebResult(name = "up_ret")

public String UploadMsg

(

@WebParam(name = "msg_item")

MsgItem item

);

/**

* 查询报文信息列表

* @return报文信息列表

*/

@WebResult(name = "msgList")

public ListObject select_msglist ();

}

(2)实现接口

在完成接口的定义之后,可以开始编写java 类来实现上述接口。此处使用@WebService 指定服务接口的路径。

代码片段如下:

@WebService(endpointInterface = "com.test.busw.service.file.MsgTrans") public class MsgTransServ implements MsgTrans { private String ftphost = "192.168.1.118"; private String ftpuser = null ; private String ftpuserpasswd = null ;

private final static String msgoutpath = " msgout/"; private final static String localpath_err = "err/"; private static final String MyCharSet = "GB2312";

// 实现报文上传方法

@WebResult(name = "up_ret") public String UploadMsg(@WebParam(name = "msg_item") MsgItem item) { Object obj = SecurityContextHolder.getContext ().getAuthentication().getPrincipal(); if (obj instanceof UserDetails)

{ ftpuser = ((UserDetails) obj).getUsername(); ftpuserpasswd = ((UserDetails) obj).getPassword(); } else {

return "用户验证失败!";

} DataHandler handler = item.getMsgfile(); try { InputStream is = handler.getInputStream(); SimpleDateFormat format = new

SimpleDateFormat("yyyyMMddHHmmssSSS"); String token = format.format(new Date()); String filename = item.getFilename() + token + "." + item.getFiletype(); OutputStream os = new FileOutputStream(new File(msgoutpath + filename)); byte [] b = new byte [100000]; int bytesread = 0; while ((bytesread = is.read(b)) != -1) {

os.write(b, 0, bytesread);

相关文档
最新文档