2009-12-28 28 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