JAX-RS Exception Mapper не работает в контейнере Grizzly
Работая над веб-приложением в Джерси с командой, по мере того, как проект становился все больше и больше, мы решили переключиться с Tomcat на Grizzly, чтобы разрешить развертывание частей проекта на разных номерах портов. Теперь я обнаружил, что обработка пользовательских исключений, которая у нас есть, не работает сейчас, вместо этого я всегда получаю страницу гризли html.
Пример исключения:
public class DataNotFoundException extends RuntimeException{
private static final long serialVersionUID = -1622261264080480479L;
public DataNotFoundException(String message) {
super(message);
System.out.println("exception constructor called"); //this prints
}
}
Mapper:
@Provider
public class DataNotFoundExceptionMapper implements ExceptionMapper<DataNotFoundException>{
public DataNotFoundExceptionMapper() {
System.out.println("mapper constructor called"); //doesnt print
}
@Override
public Response toResponse(DataNotFoundException ex) {
System.out.println("toResponse called"); //doesnt print
ErrorMessage errorMessage = new ErrorMessage(ex.getMessage(), 404, "No documentation yet.");
return Response.status(Status.NOT_FOUND)
.entity(errorMessage)
.build();
//ErrorMessage is a simple POJO with 2 string and 1 int field
}
}
Я не уверен, где источник проблемы, при необходимости я могу предоставить больше информации / кода. В чем проблема, что я могу попробовать?
РЕДАКТИРОВАТЬ:
Main.class:
public class Main {
/**
* Main method.
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
...
List<ServerInfo> serverList = new ArrayList<ServerInfo>();
serverList.add(new ServerInfo(
"api",8450,
new ResourceConfig().registerClasses(
the.package.was.here.ApiResource.class)
));
for(ServerInfo server : serverList) {
server.start();
}
System.out.println("Press enter to exit...");
System.in.read();
for(ServerInfo server : serverList) {
server.stop();
}
}
}
РЕДАКТИРОВАТЬ 2: на основе этого вопроса я пытался использовать это ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, "true"
собственность, которая только помогла немного. Я все еще получаю html-страницу гризли, когда возникает исключение, но теперь я вижу свое исключение (+ трассировка стека) в теле страницы.
1 ответ
Вы регистрируете только один класс ресурсов для всего приложения
new ResourceConfig().registerClasses(
eu.arrowhead.core.api.ApiResource.class
)
Картограф должен также быть зарегистрирован
new ResourceConfig().registerClasses(
eu.arrowhead.core.api.ApiResource.class,
YourMapper.class)
)
Вы также можете использовать сканирование пакетов, которое подберет все классы и автоматически зарегистрирует их, если они помечены @Path
или же @Provider
new ResourceConfig().packages("the.packages.to.scan")