2010-10-01 149 views
1

我一直在創建一個基於SAAJ的客戶端。一切似乎都工作正常,直到我實現邏輯發送附件作爲Web服務請求的一部分。SAAJ與JAXB的兼容性

Web服務操作很簡單 - 它需要一個用於文件位置的字符串元素和一個用於文件內容的base64binary元素。

我已經測試了使用SoapUI的ws操作,並且一切似乎都是按順序的。但是,當我從基於SAAJ的客戶端發送文件附件時,Web服務操作將僅接收文件位置元素的值。我在ws-server上編寫了一個處理程序來攔截WS操作請求,以查看附件是否能夠訪問Web服務。正如預期的那樣,附件已經很好了,我可以使用處理程序中的SAAJ API來訪問它的內容。

這只是讓我想知道 - 使用SAAJ發送附件並通過JAXB綁定接收附件時是否存在兼容性問題?有什麼我錯過了嗎?

感謝您的任何幫助!

回答

1

您需要確保在Unmarshaller上註冊AttachmentUnmarshaller以接收JAXB中的附件。

import javax.activation.DataHandler; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.attachment.AttachmentUnmarshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jaxbContext = JAXBContext.newInstance(Demo.class); 
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
     unmarshaller.setAttachmentUnmarshaller(new MyAttachmentUnmarshaller()); 
    } 

    private static class MyAttachmentUnmarshaller extends AttachmentUnmarshaller { 

     @Override 
     public DataHandler getAttachmentAsDataHandler(String cid) { 
      // TODO - Lookup MIME content by content-id, cid, and return as a DataHandler. 
      ... 
     } 

     @Override 
     public byte[] getAttachmentAsByteArray(String cid) { 
      // TODO - Retrieve the attachment identified by content-id, cid, as a byte[] 
      ... 
     } 

    } 

} 
+0

如何確保?另外,如果AttachmentUnmarshaller未註冊,那麼通過SoapUI發送的附件怎樣才能正確解析? – anirvan 2010-10-01 12:57:20

+0

您是否使用生成的客戶端或手寫客戶端與您的服務? – 2010-10-01 13:26:33

+0

客戶是手寫的,基於SAAJ。由於客戶端需要與許多Web服務進行接口,因此我們不能簡單地生成特定於任何特定WSDL的綁定。 – anirvan 2010-10-01 13:28:25