JAX-WS всегда отправляет вложения MTOM встроенные

В принципе, я хочу создать клиент веб-сервисов для отправки сообщения mtom soap с помощью метода прокси. Я создал свои сервисные артефакты из веб-службы wsdl. Сообщение создается правильно, однако, когда я включаю mtom и добавляю вложение, вложение всегда отправляется в линию, а не в отдельную часть mime. Его как mtom включен, но по какой-то причине он решает не оптимизировать сообщение и поэтому отправляет его в линию. Выполнение того же кода через soapui дает правильный результат, поэтому я знаю, что сама услуга его примет.

Вот мой базовый код для создания запроса на мыло и его отправки. Я включаю mtomfeature, но также пытался сделать это с помощью soapBinding.setMTOMEnabled(true); Для обоих методов я отлаживал его с помощью ((SOAPBinding) binding).isMTOMEnabled(), чтобы убедиться, что он включен.

// initiate services....

// create service and enable mtom
WebServiceBlah service = new WebServiceBlah(new URL(wsdlURL), SERVICE_NAME);
WebServiceBlahPort port = service.getWebServiceBlahPort(new MTOMFeature(true, 3072));

// load file
File file = new File("/home/mypdf.pdf");
FileInputStream fileinputstream = new FileInputStream(file);
int numberBytes = fileinputstream.available();
byte bytearray[] = new byte[numberBytes];
fileinputstream.read(bytearray);
fileinputstream.close();

// create uploadResult
UploadResult request = new UploadResult();

// create attachment
AttachmentType attachment = new AttachmentType();
attachment.setContentType("application/doc");
attachment.setValue(bytearray);

// create result and add attachment to it
RenderedResult result = new RenderedResult();
result.setResult(attachment);
result.setResultContentType("pdf");
result.setResultName("a pdf file");

// add result to request
request.getResult().add(result);

// send request
port.UploadResults(request);

То, что я получаю, - это мое приложение, которое отправляется как показано ниже. (захвачен с помощью wirehark)

POST /blah/ws/ HTTP/1.1
Content-type: multipart/related;start="<rootpart*[email protected]>";type="application/xop+xml";boundary="uuid:15c3ee3b-60c7-4726-a52c-8080965e4536";start-info="text/xml"
Soapaction: ""
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
User-Agent: JAX-WS RI 2.1.6 in JDK 6
Host: 123.123.123.123
Connection: keep-alive
Content-Length: 12372

--uuid:15c3ee3b-60c7-4726-a52c-8080965e4536    
Content-Id: <rootpart*[email protected]>    
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"    
Content-Transfer-Encoding: binary

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header></S:Header>
<S:Body>
<ns2:uploadResult xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
    <renderedResult>
        <result xmime:contentType="application/doc">JVBERi0xLjQKJaqrrK0KNCAwIG9iago8</result>
        <resultContentType>pdf</resultContentType>
        <resultName>a pdf file</resultName>
    </renderedResult>
</ns2:uploadResult>
</S:Body>
</S:Envelope>
--uuid:15c3ee3b-60c7-4726-a52c-8080965e4536

Я хочу, чтобы вложение в теге результатов было заменено встроенным тегом и вложение, добавленное в сообщение с мылом в другой части mime. например,

<result xmime:contentType='application/doc'>
    <inc:Include href="cid:myid3" xmlns:inc='http://www.w3.org/2004/08/xop/include'/>
</result>

Затем добавляется следующее сообщение о мыле

------=_Part_10_28027205.1314348995670
Content-Type: application/pdf
Content-Transfer-Encoding: binary
Content-ID: cid:myid3
Content-Disposition: attachment; name="mypdf.pdf"
JVBERi0xLjQKJaqrrK0KNCAwIG9iago8

Ответ 1

Некоторые вещи могут повлиять на то, действительно ли вложения MTOM используются.

На сервере, во-первых, очевидно: убедитесь, что ваша реализация службы имеет аннотацию @MTOM. Вы также можете отрегулировать пороговое значение (как уже указывал SteveJ) из этой аннотации, используя свойство threshold().

Иногда обработчики на сервере могут помешать использованию вложений MTOM. Любой обработчик сериализует SOAP-сообщение в массив строк или байтов (общий для обработчиков стиля отладки, которые записывают содержимое сообщений в журналы) предотвратит использование вложений MTOM. Если возможно, попробуйте отключить цепочку обработчиков и посмотреть, если после этого появятся вложения MTOM.

Ответ 2

Я столкнулся с такой же проблемой (встроенные вложения), но, похоже, просто неправильно отслеживает SOAP-сообщение (по MessageHandler): он играет до (на клиенте) и после (на сервере) MtomCodec.encode(Packet packet, OutputStream out). Реальное сообщение можно увидеть в java-коде в OutputStream out:

com\sun\xml\ws\jaxws-rt\2.2.10\jaxws-rt-2.2.10-sources.jar!\com\sun\xml\ws\encoding\MtomCodec.java

         for(ByteArrayBuffer bos : mtomAttachments){
             bos.write(out);
         }

Работает только с new MTOMFeature(true, 3072) на стороне клиента.