JAX-RS Custom ExceptionMapper не перехватывает RuntimeException

Я хочу обернуть подкладку RuntimeExceptions в пользовательский формат json, чтобы контейнер сервлета не выгружал трассировку стека клиенту .

Я следую этому вопросу: Пользовательское исключение JAX-RS (Джерси) с XML или JSON . При вызове:

try {
  doSomething(parameters);
}
catch(RuntimeException e) {
  throw new MyCustomException(500 , e.getMessage() , Status.INTERNAL_SERVER_ERROR);
}

Когда я намеренно вводил неправильные параметры (и инициировал RuntimeException , вызванный doSomething () ), я не видел, чтобы MyCustomExceptionMapper работал. Вместо этого создается дамп контейнера сервлета:

The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
api.MyCustomException: (underlaying msgs)

MyCustomExceptionMapper действительно зарегистрирован в javax.ws.rs.core.Application :

  @Override
  public Set> getClasses()
  {
    Set> set = new HashSet>();
    set.add(other classes);
    set.add(MyCustomExceptionMapper.class);
    return set;
  }

Что я пропустил?

Большое спасибо!

Среда: JAX-RS, jersey-server 1.5

спецификация классов:

class MyCustomException extends RuntimeException 
@Provider
class MyCustomExceptionMapper implements ExceptionMapper

обновлено :

Я подозреваю, что Application.getClasses () никогда не вызывается, поэтому я добавляю несколько сообщений println:

  @Override
  public Set> getClasses()
  {
    System.out.println("\n\n\n\n ApiConfig getClasses");
  }

И на самом деле он никогда не отображается!

Я уверен, что этот ApiConfig находится в web.xml:

  
    javax.ws.rs.core.Application
    destiny.web.api.ApiConfig
  

Но почему кажется, что Джерси никогда его не называет?

6
задан Community 23 May 2017 в 11:58
поделиться