是否可以使用 JAX WS Dispatch API 处理用户定义的异常?
我正在使用以下代码片段执行动态 Web 服务调用:
JAXBContext jc = getJAXBContext(requestClass, responseClass, jaxbContextExtraClasses);
Dispatch<Object> dispatch = service.createDispatch(portQName, jc, Service.Mode.PAYLOAD);
Object requestValue = getRequestValue(requestClass, pOrderedParameters);
JAXBElement<?> request =
new JAXBElement(new QName(serviceQNameStr, pOperationName), requestValue.getClass(), null, requestValue);
Object tmpResponse = dispatch.invoke(request);
调用工作完美,除非我在服务上添加用户定义的异常(基本 UserException 扩展 java.lang.Exception)。
首先我得到:
javax.xml.bind.UnmarshalException: 意想不到的元素 (uri:"http://schemas.xmlsoap.org/soap/envelope/" , 本地:“故障”)。预期的元素是 <{http://my.namespace/}myMethod>,http://my.namespace/}myResponse>
然后我将 UserException_Exception JAX-WS 生成的类型添加到我的 JAXB 上下文中,然后获取:
由以下原因引起:com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:IllegalAnnotationExceptions 计数为 1 java.lang.StackTraceElement 没有无参数默认构造函数。 该问题与以下位置有关: 在 java.lang.StackTraceElement 在 public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace() 在 java.lang.Throwable 在 java.lang.Exception
我发现的唯一可用的解决方案是:
- 直接调度 Soap 消息并直接处理 Soap 错误(这是 Jboss JAX-WS 实现使用服务接口执行标准 JAX-WS 调用的方式)。这对我来说不是一个可用的解决方案,我想使用高级实现(我越接近 Soap 消息,我的代码就越不动态)
- 使用 JAXBRIContext.ANNOTATION_READER,这是特定于实现的,不是可用的解决方案对我来说,为了将 java.lang.Exception 注释为 @XmlTransient,
具有用户定义异常的服务使用 JAX-WS 生成的标准客户端存根并使用 Soap UI 等工具表现良好。当我在 JAXB 上下文中没有用户定义的异常工件时,以及在调用期间,当我在 JAXB 上下文中添加这些非 JAXB 兼容工件时,消息反序列化时会出现问题。
我在 Jboss 4.2.3.GA 中使用 Jboss WS webservice 堆栈
欢迎对此问题的任何优雅的解决方案!
I'm performing dynamic webservices call using following code snippet:
JAXBContext jc = getJAXBContext(requestClass, responseClass, jaxbContextExtraClasses);
Dispatch<Object> dispatch = service.createDispatch(portQName, jc, Service.Mode.PAYLOAD);
Object requestValue = getRequestValue(requestClass, pOrderedParameters);
JAXBElement<?> request =
new JAXBElement(new QName(serviceQNameStr, pOperationName), requestValue.getClass(), null, requestValue);
Object tmpResponse = dispatch.invoke(request);
Invocation works perfectly, except if I add a user defined exception on the service (a basic UserException extends java.lang.Exception).
First I get:
javax.xml.bind.UnmarshalException:
unexpected element
(uri:"http://schemas.xmlsoap.org/soap/envelope/",
local:"Fault"). Expected elements are
<{http://my.namespace/}myMethod>,<{http://my.namespace/}myResponse>
Then I added the UserException_Exception JAX-WS generated type to my JAXB Context, and then get:
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.lang.StackTraceElement does not have a no-arg default constructor.
this problem is related to the following location:
at java.lang.StackTraceElement
at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace()
at java.lang.Throwable
at java.lang.Exception
Only solution available I found are:
- dispatch directly a Soap message and handle Soap fault directly (this is the way Jboss JAX-WS implementation performs a standard JAX-WS call using services interfaces). This is not an available solution for me, I want to use a high level implementation (the more I get close to Soap message the less dynamic my code can be)
- usage of JAXBRIContext.ANNOTATION_READER, which is implementation specific and not an available solution for me, in order to annotate annotates java.lang.Exception as @XmlTransient
The service with a user defined exception performs well using the JAX-WS generated standard client stubs and using a tool such Soap UI. Problem occurs in deserialization of the message when I have no user defined exception artifact in the JAXB context, and during invocation when I add those non JAXB compatible artifacts in the JAXB context.
I'm usign Jboss WS webservice stack within Jboss 4.2.3.GA
Any elegant solution to this problem is welcomed !
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
添加例外时您是否相应地修改了 WSDL,或者 WSDL 是从您的 SEI 生成的?那里定义了异常的错误元素吗?
Have you modified your WSDL accordingly when you added exception, or is WSDL generated from your SEI? Is there a Fault element for your Exception defined there?