2010-03-10 2 views
4

J'utilise axis2 pour créer un service Web de base qui obtiendra le nom du fichier en paramètre et produira un paquet SOAP de réponse qui aura le fichier attaché avec le SOAP.Les pièces jointes Axis2 disparaissent dans la réponse

Voici la façon dont je suis en train de créer le code de service (son simple et inspiré par Axis2 exemple de code)

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; 
} 

maintenant Le code côté client -

 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); 

Le problème est que dataHandler est toujours nul. Bien que je pense du côté du serveur, le fichier a été lu et attaché avec le paquet SOAP. Est-ce que je fais quelque chose de mal ? J'ai écrit <parameter name="enableSwA" locked="false">true</parameter> dans le fichier axis2.xml.

Répondre

2

J'ai trouvé la solution à ce problème. Le problème était, au niveau du serveur, en utilisant MessageContext msgCtx = MessageContext.getCurrentMessageContext(); appel, nous obtenons le handle du contexte de message entrant. J'ajoutais la pièce jointe sur le contexte du message entrant, alors que la pièce jointe doit être ajoutée au contexte du message sortant. Pour obtenir la poignée du contexte des messages sortants, en suivant les étapes qui doit être fait -

//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); 

Une fois que le contexte de message sortant est reçu, ajouter la pièce jointe ici -

String attachmentID = outMessageContext.addAttachment(dataHandler); 

Reste du reste du code le même.

Plus à ce sujet peut être trouvé here.

0

Configurez également le dossier temporaire où pièce jointe est téléchargé

En utilisant axis2.xml ou services.xml,

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

du côté Programmatically client,

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"); 
Questions connexes