Как расширить сгенерированное wsimport исключение, аннотированное с помощью WebFault? - PullRequest
1 голос
/ 17 декабря 2009

Я создаю веб-сервис на Java из существующего WSDL. Инструмент wsimport сгенерировал все классы Java, связанные с элементами в схеме сервиса. В частности, объявление ошибки дает следующий класс:

@javax.xml.ws.WebFault(name = "Fault", targetNamespace = "http://my.company.com/service-1")
public class ServiceFault extends java.lang.Exception {
    // constructors and faulInfo getter
}

Теперь я хотел бы расширить этот класс, чтобы добавить больше поведения:

public class MyServiceFault extends ServiceFault {
    // some behavior
}

Когда я сейчас выбрасываю экземпляры MyServiceFault из своего приложения, я ожидаю, что эти ошибки будут правильно сериализованы в XML в ответе SOAP. Но вместо этого я получаю что-то вроде этого:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Header/>
  <env:Body>
    <env:Fault>
      <faultcode>env:Server</faultcode>
      <faultstring>Some fault string.</faultstring>
    </env:Fault>
  </env:Body>
</env:Envelope>

То есть Я полностью пропускаю элемент faultInfo . Мой стек SOAP обрабатывает MyServiceFault как любое другое исключение, а не как исключение, представляющее сбой в службе.

Сначала я подумал, что аннотация @WebFault не унаследована MyServiceFault, но я попытался снова после явного добавления этой аннотации, но безуспешно.

Есть идеи, что я здесь не так делаю?

1 Ответ

0 голосов
/ 09 февраля 2010

Для чего бы это ни стоило, я реализовал это так.

import javax.xml.ws.WebFault;

@WebFault(name = "SomeException")
public class SomeException extends Exception {

    private FaultBean faultInfo;

    public SomeException(String message, FaultBean faultInfo) {
        super(message);
        this.faultInfo = faultInfo;
    }

    public SomeException(String message, FaultBean faultInfo,
            Throwable cause) {
        super(message, cause);
        this.faultInfo = faultInfo;
    }

    public FaultBean getFaultInfo() {
        return faultInfo;
    }
}

, который производит что-то вроде:

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
<faultcode>S:Server</faultcode>
<faultstring>SomeErrorString</faultstring>
<detail>
<ns2:SomeException xmlns:ns2="http://namespace/">
<message>SomeErrorMessage</message>
</ns2:SomeException>
</detail>
</S:Fault>
</S:Body>
</S:Envelope>
...