Я действительно устал от этой проблемы и не могу найти наилучшей практики для ее решения. Позвольте мне прояснить проблему с примером:
У меня есть статический метод, такой как:
public class AppError {
public static void systemError(string errorMsg) { //Like "Can't connect to DB"
HttpServletRequest request = ?????????? "HOW TO ACCESS?";
request.setAttribute("Error", errorMsg);
request.getRequestDispatcher("/error.jsp").forward(request, response(????????));
}
}
Как видите, мне нужен доступ к объектам запросов и ответов, и я НЕ ХОЧУ передавать HttpServletRequest / Response по параметрам, потому что это означает передачу его туда, где вызван AppError.systemError, а это так много мест: чтение / запись файлов , cookie и пользовательские операции, операции с базой данных и т. д. *
Мне показалось, что я нашел решение, ThreadLocal, я использовал его в фильтре и сохранил объекты запросов и ответов, но затем метод Filter.Destroy (), где я освобождаю переменные ThreadLocal методом ThreadLocal.remove (), не вызывался при тестировании. это в режиме отладки. Это означает, что поток никогда не может быть освобожден.
ServletContextListerner также НЕ является РЕШЕНИЕМ, потому что я не смог найти способ доступа к объектам запросов и ответов в объекте ServletContext. Я ожидал такой метод, как ServletContext.getRequest (), но его нет.
Я также использую JSF, но проблема с JSF заключается в том, что FacesContext также недоступен в пользовательских классах. Кроме того, JSF загружается позже, чем слушатели, поэтому я не могу использовать свою систему ошибок в слушателях, если я использовал FacesContext для получения объектов запроса и ответа.
Так какая же здесь лучшая практика? Я имею в виду, что это явная проблема, и я не могу двигаться дальше без ее решения.
Кстати, метод ошибки является примером, есть и другие места, которые мне нужны для доступа к объектам запросов и ответов.