Как предоставить подробную информацию об ошибках через SOAP с JAX WS? - PullRequest
2 голосов
/ 03 мая 2011

Я занимаюсь разработкой веб-сервисов с использованием подхода Java-first с JAX-WS.Я пытаюсь выяснить, как предоставить подробную информацию об ошибке клиенту веб-службы.В идеале я хотел бы бросить экземпляр класса ниже, когда есть ошибки проверки:

public class ValidationException extends Exception {

  private Errors errors;

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

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

Объект Errors (аналогичный Интерфейс ошибок Spring ) инкапсулирует:

  • поля, в которых есть ошибка
  • характер каждой ошибки (нарушено уникальное ограничение, превышен допустимый диапазон и т. Д.)

ValidationException выбрасываетсяоперациями моей конечной точки службы, которые выполняют проверку, например

public class MyEndpoint {

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

Клиент получает доступ к службе, используя код, сгенерированный wsimport .Однако этот код не генерирует экземпляр моего класса ValidationException, а вместо этого генерирует экземпляр класса исключения, сгенерированного wsimport (этот класс также называется ValidationException, но находится в другом пакете).Клиентский ValidationException не содержит объект Errors, поэтому подробная информация о причине ошибки теряется.

В контексте SOAP / JAX-WS экземпляр ValidationException, выданныйсервис должен быть переведен в ошибку SOAP .Я прочитал эту статью о сбоях в JAX-WS, в которой показано, как использовать компонент Fault Bean для инкапсуляции дополнительной информации о вашем исключении.Однако компонент Fault Bean, по-видимому, ограничен:

Java-классом, у которого есть конструктор без аргументов, поле String сообщения и метод получения и установки для него.Это будет ваш носитель для этого элемента soap: fault detail.

, поэтому он предоставляет только одну строку для инкапсуляции информации о причине (ах) ошибки.

Подводя итог: возможно ли предоставить подробную информацию об ошибке в коде клиента, сгенерированном для службы JAX-WS

Ответы [ 2 ]

2 голосов
/ 19 августа 2011

Ответ на вопрос да , в WebFault можно предоставить подробную информацию об ошибке.

* 1005 Е.Г. *

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

}

Как и переменная message , класс ошибок может иметь любое количество переменных, которые могут содержать значения и могут быть доступны на стороне клиента.

0 голосов
/ 14 июня 2011

В веб-службе, если вы сгенерируете исключение, он перейдет к клиенту, инкапсулированному в SoapFault, но все ваше исключение находится внутри него.
В вашем конкретном примере, как ValidationException объявлен в вашем WSDL? Есть какое-нибудь поле? Я думаю, что ваша проблема заключается в отсутствии метода setErrors () в вызове ValidationException. JAXB создает описание ваших классов по умолчанию (если аннотации JAXB не используются), добавляя в качестве полей только то, что имеет пару getter-setter.

...