是否可以使用 JAX WS Dispatch API 处理用户定义的异常?

发布于 2024-08-16 22:51:39 字数 1973 浏览 5 评论 0原文

我正在使用以下代码片段执行动态 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

独自←快乐 2024-08-23 22:51:39

添加例外时您是否相应地修改了 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?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文