Как предоставить подробную информацию об ошибке через SOAP с помощью JAX WS?

#exception #soap #exception-handling #jax-ws

#soap #исключение #jax-ws

Вопрос:

Я разрабатываю веб-сервисы, используя 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, похоже, ограничен:

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

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

Подводя итог: возможно ли предоставить подробную информацию об ошибке в клиентском коде, сгенерированном для службы 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;
    }
}
  

Класс ошибок может быть определен как,

 @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, класс error может иметь любое количество переменных, которые могут содержать значения и могут быть доступны на стороне клиента.

Ответ №2:

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