Я хочу обернуть подложку 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<Class<?>> getClasses()
{
Set<Class<?>> set = new HashSet<Class<?>>();
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<MyCustomException>
обновление :
Я подозреваю, что Application.getClasses()
никогда не вызывается, поэтому я добавляю несколько сообщений println:
@Override
public Set<Class<?>> getClasses()
{
System.out.println("\n\n\n\n ApiConfig getClasses");
}
И на самом деле, он никогда не отображается!
Я уверен, что этот ApiConfig находится в сети.xml:
<context-param>
<param-name>javax.ws.rs.core.Application</param-name>
<param-value>destiny.web.api.ApiConfig</param-value>
</context-param>
Но почему Джерси так не называет?