Как проанализировать сообщение об исключении из метода в серверной части к ответному сообщению SOAP с использованием JAX-WS? - PullRequest
1 голос
/ 01 августа 2011

Я пытаюсь представить один метод как веб-сервис из бэкэнда, используя JAX-WS с Tomcat. Бэкэнд-метод выглядит примерно так (в классе CompanyFacade):

public Company findCompanyById(Long id) throws Exception{
    Company c = null;       
    try{
        if(id == null){
            throw new Exception("Failed to get company ID");
        }
        c = baseFacade.load(Company.class, id);
        if(c == null || c.getId() == null){
            throw new Exception("No company found");
        }
    }
    catch(Exception e){
        throw new Exception(e.getMessage());
    }
    finally{
        return c;
    }       
}

Что касается класса веб-сервиса, то здесь есть WebMethod, который вызывает вышеуказанный метод:

@WebMethod(operationName = "findCompanyById", action = "urn:findCompanyById")
@WebResult(name = "Company")
public Company findCompanyById(@WebParam(name = "id") Long id) throws Exception{
    return CompanyFacade.findCompanyById(id);                           
}

Ниже приведено ответное сообщение, которое должно содержать сообщение об исключении:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:findCompanyByIdResponse xmlns:ns2="http://site.com/api/ws"/>
  </S:Body>
</S:Envelope>

Веб-сервис работает нормально, единственная проблема связана с исключением (например, компания не найдена), сообщения об исключениях могут отображаться в консоли Tomcat, но не в ответном сообщении SOAP, похоже, вызванный метод в WebMethod не возвращает никаких исключений . Поэтому возникает вопрос: как проанализировать сообщение об исключении из метода в серверной части к ответному сообщению SOAP ИЛИ есть ли другой шаблон проектирования? Заранее спасибо!

1 Ответ

1 голос
/ 01 августа 2011

SOAP не работает с исключениями - он знает только о сбоях SOAP.В вашем случае исключение, генерируемое методом findCompanyById, помещается в SOAPFault и возвращается обратно пользователю.

Необходимо создать класс, аннотированный @WebFault, и этот класс должен расширяться Exception - этоисключение, которое ваш сервис должен выбросить.Веб-сервисы не знают об исключениях во время выполнения, поэтому создание непроверенных исключений из вашего сервиса не будет иметь никакого эффекта.

В качестве альтернативы, вы можете создать FaultBean, который можно указать в аннотации @WebFault, и будет содержатьинформация о конкретной ошибке.Поля, которые вы включаете в FaultBean, будут сопоставлены с полями в теге detail ответа SOAP, в то время как сообщение вашего исключения будет сопоставлено с тегом faultstring в вашем ответе SOAP.

Вот пример:

@WebFault(faultBean = 'com.company.services.FaultBean')
public class NoCompanyFoundException extends Exception {
    private FaultBean faultBean;
    //getters, setters, etc
}

public class FaultBean {
    // message and error code are totally arbitrary, other fields could be used
    private String message;
    private String errorCode;
}
...