如何使用JAX WS提供SOAP的详细错误信息?

时间:2011-05-03 16:57:32

标签: exception soap exception-handling jax-ws

我正在使用JAX-WS的Java优先方法开发Web服务。我正在努力弄清楚如何向Web服务客户端提供详细的错误信息。理想情况下,当有验证错误时,我想抛出下面的类的实例:

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类,它有一个no-arg构造函数,一个消息String字段,以及一个getter和setter。这将成为您肥皂的载体:故障细节元素。

所以它只提供一个String来封装有关错误原因的信息。

总结:是否可以在为JAX-WS服务生成的客户端代码中提供详细的错误信息

2 个答案:

答案 0 :(得分:2)

问题的答案是,可以在WebFault中提供详细的错误信息。

E.g。

@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;
    }
}

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;
    }

}

消息变量一样,错误类可以包含任意数量的变量,这些变量可以保存值,并且可以在客户端访问。

答案 1 :(得分:0)

在Web服务中,如果抛出异常,它将转到封装在SoapFault中的客户端,但所有异常都在其中。
在您的具体示例中,如何在WSDL中声明ValidationException?它有什么领域?我认为你的问题是你的ValidationException calss中没有setErrors()方法。默认情况下,JAXB会创建类的描述(如果没有使用JAXB注释),只需将getter-setter对添加为字段。