Обработка исключений внутри веб-сервисов Apache CXF

#web-services #cxf

#веб-службы #cxf

Вопрос:

Я разработал веб-сервис с использованием Apache CXF, который будет запущен в производство очень скоро. Меня беспокоит обработка исключений в этом, я не уверен, правильно ли то, что я следовал, или нет.

У меня есть метод, показанный ниже, который я предоставил i как веб-сервис

 import javax.jws.WebService;

@WebService
public interface TataWebService {
    public String distragery()throws Exception;

}
  
 public String distrager throws Exception {
    int a  = 30;
    strategyData = "currentlyhadcoced" ;

    if(a==30) {
        throw new IncorrectProjectIdsException("The Value of a is 30");
    }

    return strategyData;
}
  

И способ, которым я определил пользовательское исключение, заключается в следующем

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

    private java.lang.String incorrectProjectIdsDetails;

    public IncorrectProjectIdsException (String message) {
        super(message);
    }

    public java.lang.String getFaultInfo() {
        return this.incorrectProjectIdsDetails;
    }
}
  

Пожалуйста, скажите мне, правильно ли это, относительно объявления throws внутри сигнатуры метода или shuld, которое мы обрабатываем любым другим способом??

Большое вам спасибо

Ответ №1:

Вы должны добавить Exception в свой интерфейс определенный подкласс of, который снабжен @WebService комментариями, чтобы механизм JAX-WS знал, что нужно публиковать информацию о возможных ошибках. Это потому, что эта информация обнаруживается статически путем проверки объявлений, а не путем динамического обнаружения исключений, которые фактически генерируются.

Если вы застряли с API более низкого уровня, который может выдавать что угодно (это случается; действительно, это случается часто), тогда вам следует обернуть это исключение более низкого уровня. Вот простой способ сделать это:

 @WebFault(name = "ImplementationFault")    
public class ImplementationException extends Exception {
    public ImplementationException(Exception cause) {
        super(cause.getMessage(), cause);
    }
}
  

Который вы бы использовали таким образом в своем веб-методе:

 public String fooMethod(String example) throws ImplementationException {
    try {
        return doRealThingWith(example);
    } catch (Exception e) {
        throw new ImplementationException(e);
    }
}
  

(Существуют и другие способы сопоставления исключений, но они намного сложнее. Перенос, по крайней мере, прост.)

Комментарии:

1. Большое вам спасибо, но что делать, если метод выдает исключение, например IOException или какое-либо проверенное исключение. (Таким образом, метод должен выдавать бизнес, а также все эти проверенные исключения)??

2. Для этого работает описанный выше метод; вот почему я его включил. (Чего вы не можете сделать, так это превратить an IOException в ошибку напрямую, без большого количества хитростей. Я думаю. Я просто использую описанную выше технику, иногда во многих слоях.)