Вложения Axis2 исчезают в ответе - PullRequest
4 голосов
/ 11 марта 2010

Я использую axis2 для создания базового веб-сервиса, который получит имя файла в качестве параметра и создаст ответный SOAP-пакет, к которому будет прикреплен файл вместе с SOAP.

Вот как я создаю сервисный код (он прост и вдохновлен примером кода 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 ]

2 голосов
/ 11 марта 2010

Я нашел решение этой проблемы.Проблема заключалась в том, что на стороне сервера с помощью вызова 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);

Остальная частькод остается прежним.

Подробнее об этом можно узнать здесь .

0 голосов
/ 11 марта 2010

Также настройте временную папку, в которую будет загружаться вложение

Использование 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");
...