2010-03-10 51 views
4

我正在使用axis2來創建一個基本Web服務,該服務將獲取文件名作爲參數,並生成一個響應SOAP數據包,該數據包將隨SOAP一起附加文件。Axis2附件在響應中消失

這裏是我創建服務代碼(它的簡單和Axis2的示例代碼的啓發)

public String getFile(String name) throws IOException 
{ 
MessageContext msgCtx = MessageContext.getCurrentMessageContext(); 
File file = new File (name); 
System.out.println("File = " + name); 
System.out.println("File exists = " + file.exists()); 
FileDataSource fileDataSource = new FileDataSource(file); 
System.out.println("fileDataSource = " + fileDataSource); 
DataHandler dataHandler = new DataHandler(fileDataSource); 
System.out.println("DataHandler = " + dataHandler); 
    String attachmentID = msgCtx.addAttachment(dataHandler); 
    System.out.println("attachment ID = " + attachmentID); 
    return attachmentID; 
} 

現在的客戶端代碼的方式 -

 MessageContext response = mepClient 
      .getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE); 
    SOAPBody body = response.getEnvelope().getBody(); 
    OMElement element = body.getFirstElement().getFirstChildWithName(
    new QName("http://service.soapwithattachments.sample","return")); 
    String attachementId = element.getText(); 
    System.out.println("attachment id is " + attachementId); 
    Attachments attachment = response.getAttachmentMap(); 
     DataHandler dataHandler = attachment.getDataHandler(attachementId); 

問題是,DataHandler的始終空值。儘管我認爲在服務器端,文件已經被讀取並且與SOAP數據包一起被附加。難道我做錯了什麼 ?

編輯: 我把<parameter name="enableSwA" locked="false">true</parameter>放在axis2.xml文件中。

回答

2

我找到了這個問題的解決方案。 問題是,在服務器端,通過使用MessageContext msgCtx = MessageContext.getCurrentMessageContext();調用,我們得到了傳入消息上下文的句柄。我在傳入的消息上下文中添加附件,而附件需要添加到傳出的消息上下文中。 要獲得傳出消息上下文句柄,下面的步驟需要完成 -

//this is the incoming message context 
    MessageContext inMessageContext = MessageContext.getCurrentMessageContext(); 
    OperationContext operationContext = inMessageContext.getOperationContext(); 
    //this is the outgoing message context 
    MessageContext outMessageContext =  operationContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE); 

一旦傳出消息上下文被接收,這裏添加附件 - 代碼遺體

String attachmentID = outMessageContext.addAttachment(dataHandler); 

休息一樣。

更多關於此可以發現here

0

同時配置臨時文件夾,其中連接將被下載

使用axis2.xml或services.xml中,

<parameter name="cacheAttachments" locked="false">true</parameter> 
<parameter name="attachmentDIR" locked="false">temp directory</parameter> 
<parameter name="sizeThreshold" locked="false">4000</parameter> 

編程在客戶機端,

options.setProperty(Constants.Configuration.CACHE_ATTACHMENTS, 
                Constants.VALUE_TRUE); 
options.setProperty(Constants.Configuration.ATTACHMENT_TEMP_DIR,TempDir); 
options.setProperty(Constants.Configuration.FILE_SIZE_THRESHOLD, "4000");