【问题标题】:How to provide detailed error information over SOAP with JAX WS?如何使用 JAX WS 通过 SOAP 提供详细的错误信息?
【发布时间】:2011-08-17 21:27:48
【问题描述】:

我正在使用带有 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 类,它有一个无参数构造函数、一个消息字符串字段以及一个 getter 和 setter。这将是您的 soap:fault detail 元素的载体。

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

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

【问题讨论】:

    标签: exception soap exception-handling jax-ws


    【解决方案1】:

    问题的答案是,可以在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;
        }
    }
    

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 2023-01-04
        • 2018-03-17
        相关资源
        最近更新 更多