исключение saaj - невозможно проанализировать тип контента: null

Я новичок в веб-сервисах и работаю с примером SAAJ для отправки и получения вложений (двоичных файлов). Я могу заставить его работать, когда клиент отправляет файл, но не когда он его запрашивает. Я получаю исключение на стороне клиента:
ОШИБКА: "Содержимое не разрешено в прологе". 24 октября 2012 г., 13:59:28 : невозможно создать конверт из данного источника

У кого-нибудь есть идеи??? Мой клиентский код выглядит следующим образом:

SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection con = scf.createConnection();
SOAPFactory soapFactory = SOAPFactory.newInstance();
MessageFactory mf = MessageFactory.newInstance();

SOAPMessage msg = mf.createMessage();
SOAPHeader header = msg.getSOAPHeader();
header.detachNode();

SOAPBody body = msg.getSOAPBody();
Name bodyName = soapFactory.createName(
"remoteOpen", "remoteOpen", 
"http://schemas.remoteOpen.com/remoteOpen");
SOAPBodyElement bodyElement = body.addBodyElement(bodyName);
SOAPElement projectName = bodyElement.addChildElement("projectName");
projectName.addTextNode("filename");

msg.saveChanges();

// create the endpoint and send the message
URL endpoint = new URL("http://localhost:8080/RemoteSaveProject/OpenServlet");
SOAPMessage response = con.call(msg, endpoint);
con.close();

SOAPBody responseBody = response.getSOAPBody();
SOAPElement ackElem = (SOAPElement)responseBody.getFirstChild();
String acknowledgement = ackElem.getValue();

код сервера выглядит так:

MimeHeaders mimeHeaders = new MimeHeaders();
Enumeration en = request.getHeaderNames();
while (en.hasMoreElements()) 
{
     String headerName = (String)en.nextElement();
     String headerVal = request.getHeader(headerName);
     StringTokenizer tk = new StringTokenizer(headerVal, ",");
     while (tk.hasMoreTokens()){
          mimeHeaders.addHeader(headerName, tk.nextToken().trim());
     }
}
SOAPMessage message = mf.createMessage(mimeHeaders, request.getInputStream());
SOAPBody body = message.getSOAPBody();

Name bodyName = soapFactory.createName(
                "remoteOpen", "remoteOpen", 
                "http://schemas.remoteOpen.com/remoteOpen");

        Iterator projects = body.getChildElements(bodyName);
        SOAPElement project = (SOAPElement)projects.next();
        Iterator projectNameIter = project.getChildElements(soapFactory.createName("projectName"));
        SOAPElement projectNameEle = (SOAPElement)projectNameIter.next();
        String projectName = projectNameEle.getValue();
        File file = new File(projectName);

        SOAPMessage reply = mf.createMessage();
        SOAPHeader header = reply.getSOAPHeader();
        header.detachNode();
        SOAPBody replyBody = reply.getSOAPBody();
        SOAPBodyElement bodyElement = replyBody.addBodyElement(soapFactory.createName("ack"));
        bodyElement.addTextNode("OK");

        DataHandler dh = new DataHandler(new FileDataSource(file));
        AttachmentPart attachment = reply.createAttachmentPart(dh);
        attachment.setContentId("123");
        reply.addAttachmentPart(attachment);
        reply.saveChanges();

        response.setStatus(HttpServletResponse.SC_OK);
        putHeaders(reply.getMimeHeaders(), response);

        response.setContentType("text/xml");
        ServletOutputStream replyOS = response.getOutputStream();
        reply.writeTo(replyOS);
        replyOS.flush();
        replyOS.close();  

putHeaders выглядит так:

Iterator it = headers.getAllHeaders();

    while (it.hasNext()) 
    {
        MimeHeader header = (MimeHeader) it.next();
        String[] values = headers.getHeader(header.getName());

        if (values.length == 1) 
        {
            res.setHeader( header.getName(), header.getValue());
        } 
        else 
        {
            StringBuffer concat = new StringBuffer();
            int i = 0;

            while (i < values.length) 
            {
                if (i != 0)
                {
                    concat.append(',');
                }
                concat.append(values[i++]);
            }
            res.setHeader(header.getName(), concat.toString());
        }
    }

person user1584120    schedule 24.10.2012    source источник
comment
Вы разместили правильный код на стороне клиента? Какая строка выдает ошибку (SOAPMessage response = con.call(msg, endpoint);)?   -  person Germann Arlington    schedule 24.10.2012
comment
это правильный код на стороне клиента, хотя похоже, что он исходит со стороны сервера... это происходит в момент: SOAPMessage response = con.call(msg, endpoint);   -  person user1584120    schedule 24.10.2012
comment
Если ошибка возникает в этой строке, это означает, что сервер получил запрос, обработал его и уже вернул ответ. Ошибка указывает на то, что данные/сообщение, возвращаемые сервером, не соответствуют ожидаемому формату. Попробуйте подключиться к серверу по телнету и проверьте ответ — хорошо ли он отформатирован и содержит ли он всю ожидаемую информацию?   -  person Germann Arlington    schedule 24.10.2012
comment
это имеет смысл, когда я добавил строку, чтобы установить тип контента как application/octet-stream, он снова взорвался, но с другим сообщением: SEVER: SAAJ0537: Invalid Content-Type. Может быть сообщение об ошибке вместо сообщения SOAP   -  person user1584120    schedule 24.10.2012
comment
есть ли какие-либо примеры сервлета, присоединяющего двоичный файл к ответу SOAP?   -  person user1584120    schedule 24.10.2012
comment
Я немного изменил код сервера (изменил исходный код выше), и теперь я получаю другое исключение: ОШИБКА: «Содержимое не разрешено в прологе». 24 октября 2012 г., 13:59:28 : Невозможно создать конверт из данного источника. У кого-нибудь есть идеи???   -  person user1584120    schedule 24.10.2012
comment
Вы пробовали то, что я предложил? Вы проверяли, какой формат возвращает сервер? Вполне вероятно, что сервер возвращает правильные данные, но ваш клиент не обеспечивает корректного сопоставления данных, возвращаемых сервером... Или вы ожидаете другого ответа? Затем опубликуйте свой ожидаемый ответ, и, возможно, кто-нибудь даст его вам...   -  person Germann Arlington    schedule 24.10.2012


Ответы (1)


Если вы используете движок приложений Google, как и я, проблема в том, что GAE не поддерживает com.sun.xml.internal.messaging.saaj.packaging.mime.internet.ParameterList, который используется внутри где-то в цепочке вызовов javax.xml.soap.SOAPConnection.call(). Поэтому вы должны использовать обходной путь.

Я лично сделал это, используя java.net.HttpURLConnection вместо javax.xml.soap.SOAPConnection и вручную отправляя и анализируя сообщения SOAP.

person bat_ventzi    schedule 21.04.2013