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

标签 java exception jaxb jax-ws jbossws

我正在使用以下代码片段执行动态 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: unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Fault"). Expected elements are <{http://my.namespace/}myMethod>,<{http://my.namespace/}myResponse>

然后我将 UserException_Exception JAX-WS 生成的类型添加到我的 JAXB 上下文中,然后获取:

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

我发现的唯一可用的解决方案是:

  • 直接调度 Soap 消息并直接处理 Soap 故障(这是 Jboss JAX-WS 实现使用服务接口(interface)执行标准 JAX-WS 调用的方式)。这对我来说不是一个可用的解决方案,我想使用高级实现(我越接近 Soap 消息,我的代码就越不动态)
  • 使用 JAXBRIContext.ANNOTATION_READER(这是特定于实现的,对我来说不是可用的解决方案),以便将 java.lang.Exception 注释为 @XmlTransient

使用 JAX-WS 生成的标准客户端 stub 并使用 Soap UI 等工具,具有用户定义异常的服务表现良好。当我在 JAXB 上下文中没有用户定义的异常工件时,以及在调用期间,当我在 JAXB 上下文中添加这些非 JAXB 兼容工件时,消息的反序列化会出现问题。

我在 Jboss 4.2.3.GA 中使用 Jboss WS Web 服务堆栈

欢迎任何解决此问题的优雅解决方案!

最佳答案

添加异常(exception)时您是否相应地修改了 WSDL,或者 WSDL 是从您的 SEI 生成的?那里定义了异常的错误元素吗?

关于java - 是否可以使用 JAX WS Dispatch API 处理用户定义的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1970458/

相关文章:

java - 在使用 Java 运行一些 Selenium WebDriver 测试之前清除缓存

java - 日期时间在应用程序中正确但在 mysql [时区] 中错误

java - 如何管理多对一jpa以使用DTO保存和查找数据

java - Spring -Neo4j 数据库 : Save Enum String to Database and Return as Enum

java - DynamoDB Java table.query 异常

java - 如何在 Spring Integration 中的异常路由器中使用根本原因异常类型

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

java - JAXB - 如果为 false,则抑制 boolean 属性

java - JAXB 入门

java - 使用库中的包初始化 JAXBContext 是否有问题?