#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.