簡體   English   中英

JAX-WS - 映射故障的例外

[英]JAX-WS - Map Exceptions to faults

我正在使用JAX WS來公開WebService。 此服務的某些操作可能會生成異常。 不是內部服務器異常,而是依賴於操作調用的輸入參數的異常。

如果我指定我的操作拋出自定義異常,如下所示:

@WebService
@SOAPBinding(style = Style.RPC, use = Use.LITERAL)
public class MyServiceEndpointImpl implements MyServiceEndpoint {

    @WebMethod
    public void throwsException throws InvalidInputException;
}

運行應用程序時,我最終得到以下堆棧跟蹤:

 com.sun.xml.ws.model.RuntimeModelerException: runtime modeler error: Wrapper class com.mypackage.ws.services.jaxws.InvalidInputExceptionBean is not found. Have you run APT to generate them?
    at com.sun.xml.ws.model.RuntimeModeler.getClass(RuntimeModeler.java:285)
    at com.sun.xml.ws.model.RuntimeModeler.processExceptions(RuntimeModeler.java:1006)
    at com.sun.xml.ws.model.RuntimeModeler.processRpcMethod(RuntimeModeler.java:969)
    at com.sun.xml.ws.model.RuntimeModeler.processMethod(RuntimeModeler.java:546)
    at com.sun.xml.ws.model.RuntimeModeler.processClass(RuntimeModeler.java:370)
    at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:256)
    at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:322)
    at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:188)
    at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:467)
    at org.jvnet.jax_ws_commons.spring.SpringService.getObject(SpringService.java:333)
    at org.jvnet.jax_ws_commons.spring.SpringService.getObject(SpringService.java:45)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:121)

@XmlRootEntity添加到InvalidInputException並不能解決問題。

如果這不是報告Web服務故障的推薦方法,那么有更好的方法嗎? 我的異常是否應該從RuntimeException繼承並依賴於傳輸進行錯誤處理(即,所有內容最終都將包含在SOAPException中)? 我希望有類似Spring-WS的SoapFaultAnnotationExceptionResolver 是否有類似的東西可用於JAX-WS?

您是否嘗試使用@WebFault注釋您的異常? 另外,你實現了getFaultInfo()嗎?

編輯:我意識到我的答案可能不夠詳細。 正如在這個帖子中提醒的那樣(例如):

JAX-WS 2.0規范要求使用@WebFault注釋的異常必須有兩個構造函數和一個方法[獲取故障信息的getter]:

 WrapperException(String message, FaultBean faultInfo) WrapperException(String message, FaultBean faultInfo, Throwable cause) FaultBean getFaultInfo() 

WrapperException被異常的名稱替換, FaultBean被實現故障bean的類名替換。 故障bean是一個包含故障信息的Java bean,Web服務客戶端使用它來了解故障原因。

這在JAX-WS規范的2.5故障中有詳細說明。 你的例外符合這個嗎? 你可以發布代碼嗎?


OP是對的。 根據規范@WebFault服務特定異常,不需要使用@WebFault批注,JAX-WS可以動態生成包裝bean,用於與2.5節中描述的模式不匹配的異常(只需提供一個getter for the您想要出現在故障中的信息)。 為匹配第2.5節描述的(即有一個例外圖案的例外getFaultInfo方法和@WebFault注解),則FaultBean被映射所述例外XML模式時用作輸入到JAXB。

因此,上面建議的解決方案(匹配2.5節中描述的模式)只是一種解決方法。 包裝bean的生成應該適用於其他異常。 我不知道為什么這會失敗。

以上答案的補充。 我最終將此作為我的InvalidInputException實現:

@WebFault(faultBean = "com.mypackage.ws.exception.FaultBean")
public class InvalidInputException extends Exception {

    private static final long serialVersionUID = 1L;

    private FaultBean faultBean;

    public InvalidInputException() {
        super();
    }

    public InvalidInputException(String message, FaultBean faultBean, Throwable cause) {
        super(message, cause);
        this.faultBean = faultBean;
    }

    public InvalidInputException(String message, FaultBean faultBean) {
        super(message);
        this.faultBean = faultBean;
    }

    public FaultBean getFaultInfo() {
        return faultBean;
    }
}

FaultBean只是一個簡單的POJO,目前根本沒有數據。 現在,根據JAX-WS規范(參見3.7 Service Specific Exception),它符合使用@WebFault注釋的異常所需的內容,因此它不會為它創建一個包裝器bean,這可能是失敗的。

這是一個不錯的解決方法,但它沒有解釋問題中的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM