JerseyServlet – ExceptionMapper не всегда работает при развертывании

Я пытаюсь создать глобальный ExceptionMapper для своего приложения, этот ExceptionMapper покажет исключение в консоли, затем снова покажет его, украсив, а затем сохранит некоторую информацию о нем в базе данных, чтобы в будущем было легче идентифицировать эти инциденты.

В моем приложении используется com.sun.jersey.spi.spring.container.servlet.SpringServlet, и я обнаружил, что могу перехватывать исключения с помощью Provider с ExceptionMapper, поэтому я сделал это:

package es.companyName.appName.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Named
@Priority(1)
@Provider
public class UncaughtExceptionHandler extends Throwable implements ExceptionMapper<Throwable> {

    private static final long serialVersionUID = 1L;
    
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    public UncaughtExceptionHandler () {
        logger.info("Provider UncaughtExceptionHandler creado correctamente");
    }
    
    @Override
    public Response toResponse(Throwable ex) {
        //some stuff
        ...
    }
}

И я объявил это в своем web.xml следующим образом:

<servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>es.companyName.appName.rs, es.companyName.appName.config</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

С этим мой ExceptionMapper работает нормально, но по какой-то причине он не всегда работает, когда я компилирую и развертываю свое приложение, иногда оно работает, а иногда нет, без изменения кода.

Я пытался отладить свой ExceptionMapper, когда он не работает и не входит туда, как будто мой ExceptionMapper загружается неправильно... В консоли появляется, что загружается правильно:

appName 2020-12-29 14:45:10.638 --- appName.config.UncaughtExceptionHandler : Provider UncaughtExceptionHandler creado correctamente
...
    INFO: Scanning for root resource and provider classes in the packages:
      es.companyName.appName.rs
      es.companyName.appName.config
    Dec 29, 2020 4:43:28 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
    INFO: Root resource classes found:
    ......
    Dec 29, 2020 4:43:28 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
    INFO: Provider classes found:
      class es.companyName.appName.config.UncaughtExceptionHandler

Но это не потому, что я не могу остановиться на отладке, это похоже на то, что развертывание игнорирует мой маппер... Есть ли что-то, что я оставил? Это должна быть какая-то настройка, которую я упускаю, но странно то, что иногда она работает правильно, и я даже могу остановиться с отладчиком.

Я читал в некоторых связанных статьях, в которых говорится, что с джерси пытается найти наилучшее соответствие для заданных исключений в своем списке картографов (который включает в себя некоторые картографы по умолчанию), вы должны сопоставить свой преобразователь с точным исключением, которое вы пытаетесь поймать, поскольку порядок картографа произвольный, но в моем случае я не хочу сопоставлять какое-то конкретное исключение, а все исключения в моем приложении.

Поскольку у меня нет другого картографа в моем приложении, те, которые делают это, должны быть картографами по умолчанию для джерси, есть ли способ их отключить? Или я что-то упускаю?

Большое спасибо за ваши ответы.


person Ise92    schedule 29.12.2020    source источник
comment
Можете ли вы привести несколько примеров случаев, когда это не работает? И да, вам нужно учитывать иерархию картографов исключений. Закрывает исключения, и есть есть встроенные преобразователи по умолчанию.   -  person Paul Samsotha    schedule 29.12.2020
comment
Привет Самсота, я пытался получить NullPointerException, SqlException и JsonMapperException, когда развертывание в порядке и работает, все эти 3 примера правильно перехватываются моим провайдером, но когда провайдер загружен неправильно, ни один из этих образцов не работает... Иногда это похоже на мой класс существует, а другие нет. Я скопировал полный лог, когда он работает, а когда нет, чтобы сравнить их с Meld и между ними нет никаких различий, они 2, кажется, загружают класс одинаково.   -  person Ise92    schedule 29.12.2020
comment
Я узнаю, что мое приложение использует пользовательскую библиотеку, в которой есть другой ExceptionMapper, который отображает Throwable, как мой, я пытался отладить его, когда мой преобразователь не работает, и бинго! Вот! Причина, по которой мой преобразователь не всегда работает, заключается в том, что иногда компилятор использует мой класс и другой этот... Есть ли способ сделать мой преобразователь более приоритетным, не изменяя какой-либо код этого другого преобразователя?   -  person Ise92    schedule 30.12.2020