Тип содержимого сообщения Java SOAP

Я использовал maven wsimport, а Java 1.7 сгенерировала код клиентской стороны SOAP. WSDL был предоставлен заказчиком, я считаю, что это сервер SOAP, поддерживаемый .NET.

После вызова службы я все время получаю сообщение об ошибке:

Сервер отправил код состояния HTTP 415: сообщение невозможно обработать, поскольку тип содержимого «application / soap + xml; charset = utf-8; не был ожидаемым типом 'text / xml; charset = utf-8 '.

Я пытаюсь изменить MimeHeader в классе SOAPMessage с помощью настраиваемого обработчика (и я правильно зарегистрировал обработчик в цепочке):

MimeHeaders mimeHeaders = msg.getMimeHeaders();
mimeHeaders.removeAllHeaders();
mimeHeaders.removeHeader("Content-Type");
mimeHeaders.addHeader(HttpHeaders.CONTENT_TYPE, "text/xml; charset=utf-8");

приведенный выше код, кажется, ничего не меняет внутри mimiHeaders, векторный объект кажется неизменным ....

затем я создал сообщение SOAP вручную

  MessageFactory newInstance = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
  MimeHeaders he = new MimeHeaders();
  he.addHeader("Content-Type", "text/xml; charset=utf-8");
  String ss = "<x:Envelope>xxxxx</x:Envelope>";
  InputStream in = new ByteArrayInputStream(ss.getBytes(StandardCharsets.UTF_8));

  SOAPMessage createMessage = newInstance.createMessage(he, in);
  createMessage.writeTo(System.out);  
  context.setMessage(createMessage);
  msg.saveChanges();

на этот раз mimeHeader и Content-Type в самом SOAPMessage установлены как text / xml; charset = utf-8

но на сервере все равно через ту же ошибку 415 application / soap + xml не ожидается ......

Я понимаю, что сервер, похоже, следует за SOAP 1.1, поэтому он ожидает text / xml ... но когда я создал фабрику, я четко указал протокол на 1.1 и вручную установил mimeHeader. Я действительно запутался

Примечание: использование SOAPUI или PostMan абсолютно нормально, проблема возникает только при использовании java-клиента, созданного wsimport.


person Junchen Liu    schedule 06.06.2017    source источник


Ответы (1)


Вы должны сначала попытаться определить проблему: на клиенте или на сервере? Поэтому я предлагаю вам добавить следующий аргумент JVM, чтобы выгрузить детали HTTP-запроса.

-Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true

Используя это, вы должны увидеть в консоли что-то вроде:

---[HTTP request - http://localhost:8780/soap/MyService]---
Accept: text/xml
Authorization: Basic *****************==
Content-Type: text/xml; charset=utf-8
SOAPAction: "xxxxx"
User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">...

Если вы видите правильное значение для ошибки Content-Type, несомненно: ошибка находится на стороне поставщика услуг.

person TacheDeChoco    schedule 18.06.2018
comment
Соответствующее свойство JVM см .: stackoverflow.com/questions/5350476/ - person TacheDeChoco; 18.06.2018