Я видел это в нескольких проектах для хранения некоторых элементов инфраструктуры (например, уникального идентификатора пользователя, для отслеживания сообщений журнала для определенного сеанса.
Он должен передаваться с осторожностью, потому что есливаш код работает на сервере Java EE, потоки будут объединены и использованы повторно для других сессий. Если вы не сбросите состояние ThreadLocal, у вас возникнут проблемы с непредвиденным вмешательством данных (как при наличии одного запуска потоказначения, соответствующие старшему прогону).
Итак, в вашем коде я пропускаю этот метод:
public static void reset() {
contexts.remove();
}
Конечно, он должен использоваться где-то: обычно в том же месте, где вы его инициализируете(возможно, фильтр WebApp?)
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
RequestContext.begin(ctx, request, response); //initialize
try {
//other stuff here
//forward request to next filter, or the servlet itself
chain.doFilter(request, response);
} finally {
RequestContext.reset();
}
}