2009-12-28 26 views
1

我执行动态web服务呼叫使用下面的代码片段:是否可以使用JAX WS Dispatch API处理用户定义的异常?

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中 在公共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生成的标准客户机存根和使用工具,例如肥皂UI执行。问题发生在消息的反序列化时,我有在JAXB上下文中没有用户定义的异常伪影,和调用期间当我添加在JAXB上下文那些非JAXB兼容伪影。

我usign的Jboss 4.2.3.GA内的Jboss WS Web服务栈

任何优雅的解决这个问题是值得欢迎的!

回答

0

你有没有相应的修改您的WSDL当您添加异常,或者是从SEI生成WSDL?在那里定义的异常是否有Fault元素?

+0

谢谢您的回答,是从我SEI生成WSDL,并有在操作异常错误元素: <故障名称=“ActionIdNotFoundExceptionDto”> <肥皂:故障名称=“ActionIdNotFoundExceptionDto”使用=“literal”/> 如果我使用JAX-WS生成的存根执行调用,则会引发ActionIdNotFoundExceptionDto_Exception,其中包含一个ActionIdNotFoundExceptionDto bean。这是我期望使用调度方法的行为。 – snowflake