xfire框架的web service无法实现大文件下载并报错

Jason-Jiao 2015-12-15 07:45:33
我使用xfire框架做的一个web service通过使用DataHandler代理的方式实现大文件下载,且客户端可以调用服务端的接口并且有log输出,但是无返回值,并报如下错误:

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Could not find the attachment cid:14501784295102-1375957038@http://www.w3.org/2001/XMLSchema
org.codehaus.xfire.fault.XFireFault: Could not find the attachment cid:14501784295102-1375957038@http://www.w3.org/2001/XMLSchema
at org.codehaus.xfire.aegis.type.mtom.AbstractXOPType.readInclude(AbstractXOPType.java:62)
at org.codehaus.xfire.aegis.type.mtom.AbstractXOPType.readObject(AbstractXOPType.java:45)
at org.codehaus.xfire.aegis.AegisBindingProvider.readParameter(AegisBindingProvider.java:169)
at org.codehaus.xfire.service.binding.AbstractBinding.read(AbstractBinding.java:206)
at org.codehaus.xfire.service.binding.WrappedBinding.readMessage(WrappedBinding.java:51)
at org.codehaus.xfire.soap.handler.SoapBodyHandler.invoke(SoapBodyHandler.java:42)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at org.codehaus.xfire.client.Client.onReceive(Client.java:406)
at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)
at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
at org.codehaus.xfire.client.Client.invoke(Client.java:336)
at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
at com.sun.proxy.$Proxy0.downloadFile(Unknown Source)
at com.neolink.test.NeoFrequencyServiceClient.main(NeoFrequencyServiceClient.java:41)

最终无法实现文件下载的功能。

客户端代码如下:
实现代码如下:
String otaServiceUrl = "http://10.0.0.53:8080/NeoCloudService/services/NeoOtaService";
Service otaServiceModel = new ObjectServiceFactory().create(INeoOtaService.class, null,
"http://10.0.0.53:8080/NeoCloudService/services/NeoCloudService?wsdl", null);
XFireProxyFactory serviceFactory = new XFireProxyFactory();
try {
INeoOtaService otaService = (INeoOtaService) serviceFactory.create(otaServiceModel, otaServiceUrl);
Client fileClient = Client.getInstance(otaService);
fileClient.setProperty("mtom-enabled", "true");
fileClient.setProperty(HttpTransport.CHUNKING_ENABLED, "true");
String fileName = "NeoCloudService.war";
File downloadFile = new File("/home/jiao/log", fileName);
DataHandler downloaddh = otaService.downloadFile(fileName);
System.out.println(downloaddh.getName());
try {
downloadFile.createNewFile();
InputStream in = downloaddh.getInputStream();
FileOutputStream out = new FileOutputStream(downloadFile);
byte[] buff = new byte[2014 * 1024];
int len = -1;
while(-1 != (len=in.read(buff, 0, buff.length))){
out.write(buff, 0, len);
}
in.close();
out.flush();
out.close();
System.out.println("down over");
} catch (IOException e) {
e.printStackTrace();
}


} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

服务端代码如下:
public interface INeoOtaService {

public String uploadFile(DataHandler dh, String fileName);

public DataHandler downloadFile(String fileName);

public String searchVersionInfo();

public String updateVersionInfo();

public String addVersionInfo();

public String deleteVersionInfo();

public String sendBroadcast();
}

public class NeoOtaService implements INeoOtaService{

@Override
public DataHandler downloadFile(String fileName) {
File file = new File(ServiceProperties.getOtaUpgradeFileUrl(), fileName);
System.out.println(file.length());
DataHandler dh = new DataHandler(new FileDataSource(file));
System.out.println(dh.getName());
return dh;
}


配置文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<service>
<name>NeoOtaService</name>
<namespace>com.neolink.service.NeoOtaService</namespace>
<serviceClass>com.neolink.api.INeoOtaService</serviceClass>
<implementationClass>com.neolink.service.NeoOtaService</implementationClass>
<properties>
<property key="mtom-enable">true</property>
</properties>
<!-- <inHandlers>
<handler handlerClass="com.neolink.service.HandlerMappingListener" />
</inHandlers> -->
</service>
</beans>
...全文
208 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jason-Jiao 2015-12-15
  • 打赏
  • 举报
回复
System.out.println(file.length()); System.out.println(dh.getName()); 这两句输出在服务端可以正常打出。

5,655

社区成员

发帖
与我相关
我的任务
社区描述
Web开发应用服务器相关讨论专区
社区管理员
  • 应用服务器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧