如何拦截 JAXB 处理 SOAP 消息的 XML 解析错误?
How to intercept XML parsing errors in JAXB processing of SOAP messages?
我可以使用 JAXB 拦截 XML 解析以检查负载吗?
我已经使用 java 的 wsimport
工具为 SharePoint WSDL 生成了代码绑定。我在 SharePoint 中调用一个名为 GetListItems
的 SOAP 方法,生成的代码正在为我执行从服务器返回的 XML 解析。
解析失败; known issue in SharePoint 用户可以在某些内容中放置特殊字符,从而破坏 SharePoint 生成的 XML。
这个堆栈跟踪给出了提示 Character reference "&#])
(注意那里没有结束双引号)——我现在最好的猜测是 XML 中有一个不可打印的字符或一些奇怪的东西正在破坏解析。修复它始于更多地了解它是如何发生的。建议?
com.sun.xml.internal.ws.encoding.soap.DeserializationException: [failed to localize] Failed to deserialize the response.(javax.xml.bind.UnmarshalException
- with linked exception:
[javax.xml.stream.XMLStreamException: ParseError at [row,col]:[2399,354]
Message: Character reference "&#])
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:111)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:77)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:147)
at com.sun.proxy.$Proxy45.getListItems(Unknown Source)
at
(Snipped bits of my code's stack trace)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.simontuffs.onejar.Boot.run(Boot.java:340)
at com.simontuffs.onejar.Boot.main(Boot.java:166)
Caused by: javax.xml.bind.UnmarshalException
- with linked exception:
[javax.xml.stream.XMLStreamException: ParseError at [row,col]:[2399,354]
Message: Character reference "&#]
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:470)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:402)
at com.sun.xml.internal.bind.v2.runtime.BridgeImpl.unmarshal(BridgeImpl.java:109)
at com.sun.xml.internal.bind.api.Bridge.unmarshal(Bridge.java:222)
at com.sun.xml.internal.ws.db.glassfish.BridgeWrapper.unmarshal(BridgeWrapper.java:257)
at com.sun.xml.internal.ws.client.sei.ResponseBuilder$DocLit.readResponse(ResponseBuilder.java:635)
at com.sun.xml.internal.ws.client.sei.StubHandler.readResponse(StubHandler.java:243)
at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:189)
at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:276)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:104)
... 14 more
您可以在客户端中打开 SOAP 消息的日志记录。参见实例
Tracing XML request/responses with JAX-WS 登录到控制台。
您可以使用像 WireShark 这样的数据包分析器来查看 XML 中的内容。添加像 'host www.whatever.com' 这样的过滤器,您将能够看到 XML 负载。它将与 HTTP 代码位于同一消息中。
我可以使用 JAXB 拦截 XML 解析以检查负载吗?
我已经使用 java 的 wsimport
工具为 SharePoint WSDL 生成了代码绑定。我在 SharePoint 中调用一个名为 GetListItems
的 SOAP 方法,生成的代码正在为我执行从服务器返回的 XML 解析。
解析失败; known issue in SharePoint 用户可以在某些内容中放置特殊字符,从而破坏 SharePoint 生成的 XML。
这个堆栈跟踪给出了提示 Character reference "&#])
(注意那里没有结束双引号)——我现在最好的猜测是 XML 中有一个不可打印的字符或一些奇怪的东西正在破坏解析。修复它始于更多地了解它是如何发生的。建议?
com.sun.xml.internal.ws.encoding.soap.DeserializationException: [failed to localize] Failed to deserialize the response.(javax.xml.bind.UnmarshalException
- with linked exception:
[javax.xml.stream.XMLStreamException: ParseError at [row,col]:[2399,354]
Message: Character reference "&#])
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:111)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:77)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:147)
at com.sun.proxy.$Proxy45.getListItems(Unknown Source)
at
(Snipped bits of my code's stack trace)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.simontuffs.onejar.Boot.run(Boot.java:340)
at com.simontuffs.onejar.Boot.main(Boot.java:166)
Caused by: javax.xml.bind.UnmarshalException
- with linked exception:
[javax.xml.stream.XMLStreamException: ParseError at [row,col]:[2399,354]
Message: Character reference "&#]
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:470)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:402)
at com.sun.xml.internal.bind.v2.runtime.BridgeImpl.unmarshal(BridgeImpl.java:109)
at com.sun.xml.internal.bind.api.Bridge.unmarshal(Bridge.java:222)
at com.sun.xml.internal.ws.db.glassfish.BridgeWrapper.unmarshal(BridgeWrapper.java:257)
at com.sun.xml.internal.ws.client.sei.ResponseBuilder$DocLit.readResponse(ResponseBuilder.java:635)
at com.sun.xml.internal.ws.client.sei.StubHandler.readResponse(StubHandler.java:243)
at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:189)
at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:276)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:104)
... 14 more
您可以在客户端中打开 SOAP 消息的日志记录。参见实例 Tracing XML request/responses with JAX-WS 登录到控制台。
您可以使用像 WireShark 这样的数据包分析器来查看 XML 中的内容。添加像 'host www.whatever.com' 这样的过滤器,您将能够看到 XML 负载。它将与 HTTP 代码位于同一消息中。