2011-05-03 67 views
2

我正在用JAX-WS使用Java優先方法開發Web服務。我正在努力弄清楚如何向Web服務客戶端提供詳細的錯誤信息。理想情況下,我想,當存在驗證錯誤,拋出下面的類的實例:如何使用JAX WS通過SOAP提供詳細的錯誤信息?

public class ValidationException extends Exception { 

    private Errors errors; 

    public ValidationException(Errors errors) { 
    this.errors = errors; 
    } 

    public Errors getErrors() { 
    this.errors; 
    } 
} 

Errors對象(類似於Spring's Errors interface)封裝:

  • 這是錯誤的
  • 領域
  • 每個錯誤的性質(唯一約束違反,允許範圍超過等)

ValidationException由執行驗證的服務端點的操作拋出,例如,

public class MyEndpoint { 

    public void doSomething(ValidateableInput input) throws ValidationException { 
    // implementation omitted 
    } 
} 

客戶訪問使用由wsimport生成的代碼的服務。但是,此代碼不會拋出我的ValidationException類的實例,而是拋出由wsimport生成的異常類的實例(該類也被命名爲ValidationException,但位於不同的包中)。客戶端的ValidationException不包含Errors對象,因此有關錯誤原因的詳細信息將丟失。

在SOAP/JAX-WS的上下文中,服務拋出的ValidationException實例必須翻譯爲a SOAP fault。我已閱讀this article關於JAX-WS中的故障demonstrates how to use a Fault Bean來封裝有關您的異常的更多詳細信息。但是,Fault Bean似乎僅限於:

一個Java類,它具有無參數構造函數,消息字符串字段以及它的getter和setter。這將是您的soap:fault detail元素的載體。

所以它只提供了一個字符串來封裝關於錯誤原因的信息。

總結:是它可以提供一個JAX-WS服務

回答

0

產生在一個Web服務,如果你拋出一個異常的客戶端代碼詳細的錯誤信息,它會去封裝在客戶端一個SoapFault,但你所有的異常都在裏面。
在您的具體示例中,如何在您的WSDL中聲明ValidationException?它有任何領域?我認爲你的問題是你的ValidationException類中沒有setErrors()方法。 JAXB默認創建你的類的描述(如果沒有使用JAXB註解),將字段添加爲具有getter-setter對的字段。

2

該問題的答案是,可以在WebFault中提供詳細的錯誤信息。

例如

@WebFault(faultBean = "com.myexample.Errors") 
public class ValidationException extends Exception { 

    private static final long serialVersionUID = 1L; 

    private Errors errors; 

    public ValidationException() { 
     super(); 
    } 

    public ValidationException(String message, Errors errors, Throwable cause) { 
     super(message, cause); 
     this.errors = errors; 
    } 

    public ValidationException(String message, Errors errors) { 
     super(message); 
     this.errors = errors; 
    } 

    public Errors getErrors() { 
     return errors; 
    } 
} 

該錯誤類可以被定義爲,

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Errors", propOrder = { 
    "message" 
}) 
public class Errors { 

    @XmlElement(required = true) 
    protected String message; 


    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String value) { 
     this.message = value; 
    } 

} 

喜歡消息變量錯誤類可以具有任意數量的變量可容納值,並且可以是在客戶端訪問。

相關問題