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")
Другие вопросы по тегам