Я хочу обернуть подкладку 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
Но почему кажется, что Джерси никогда его не называет?