Ошибки JAX-WS, когда тело SOAP содержит спецификацию UTF-8 - PullRequest
4 голосов
/ 28 октября 2009

Я разработал веб-сервис с использованием JAX-WS (v2.1.3 - Sun JDK 1.6.0_05), развернутого в WebLogic 10.3, который прекрасно работает, когда я использую клиент Java или SoapUI или другие инструменты тестирования веб-сервисов. Мне нужно использовать эту службу с помощью служб отчетов Microsoft SQL Server 2005, и я получаю следующую ошибку

Не удалось создать сообщение SOAP из-за исключение: ошибка чтения XML: неожиданное содержание персонажа

SEVERE: Couldn't create SOAP message due to exception: XML reader error: unexpected character content: "?"
com.sun.xml.ws.protocol.soap.MessageCreationException: Couldn't create SOAP message due to exception: XML reader error: unexpected character content: "?"
at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:292)
at com.sun.xml.ws.transport.http.HttpAdapter.decodePacket(HttpAdapter.java:276)
at com.sun.xml.ws.transport.http.HttpAdapter.access$500(HttpAdapter.java:93)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:432)
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:134)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:129)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:160)
at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:75)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3498)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(Unknown Source)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2180)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
Caused by: com.sun.xml.ws.streaming.XMLStreamReaderException: XML reader error: unexpected character content: "?"
at com.sun.xml.ws.streaming.XMLStreamReaderUtil.nextElementContent(XMLStreamReaderUtil.java:102)
at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:174)
at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:296)
at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:128)
at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:287)
... 22 more

Если я использую HTTP-прокси, чтобы выяснить, что SSRS отправляет в JAX-WS, я вижу EF BB BF как начало тела сообщения, а JAX-WS это не нравится. Если я удаляю специальные символы и повторно отправляю запрос с помощью Fiddler, то вызов веб-службы работает.

Почему JAX-WS взрывается со стандартной спецификацией UTF-8? Есть ли способ обойти эту проблему? Любые предложения будут ценны. Спасибо

- Винни

Ответы [ 2 ]

2 голосов
/ 14 сентября 2010

У нас была похожая проблема при записи клиента .Net в сторонний веб-сервис Java, .Net включал метку порядка байтов, и сервис Java выдавал исключение.

Сторонний метод SOAP взял в качестве аргумента одну строку, и эта строка была XML-документом (я люблю людей, которые не совсем понимают, какую проблему пытается решить SOAP!) По умолчанию .net добавил UTF- 8-байтная метка порядка в документе «полезная нагрузка» xml, что является строго правильным, но на практике вызывает проблемы.

В нашем случае мы нашли два возможных решения со стороны клиента (.net). Я не уверен, насколько легко это будет сделать из служб отчетов SQL.

String.Trim () - XML ​​должен быть помещен в строку перед передачей в метод soap, вызов .Trim () убрал метку порядка байтов. Легко.

Второй метод состоял в том, чтобы установить настройки кодировки UTF в XmlWriterSettings немного по-другому, что-то вроде следующего:

XmlWriter xmlWriter = null;
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.Encoding = new UTF8Encoding(false);
xmlWriter = XmlWriter.Create(xmlSteam, settings);

Важным битом является "новое кодирование UTF8 ( false );", этот аргумент - "encoderShouldEmitUTF8Identifier" и в значительной степени решает проблему.

1 голос
/ 28 октября 2009

Одна обходная идея: добавьте фильтр в веб-приложение, которое просто использует спецификацию, прежде чем передавать документ запроса в службу JAX-WS.

...