#java
Вопрос:
Сегодня, когда я отлаживаю свое приложение в RequestContext
методе putLoginId, я обнаружил, что класс static ThreadLocal initial не удался, contextData.get()
возвращаемое значение null, статические контекстные данные содержат только код threadlocalhash.
Мое contextData
определение в RequestContext
классе, как это:
public class RequestContext {
public static final ThreadLocal<Map<String, Object>> contextData = new ThreadLocal<>();
}
он contextData
должен быть инициализирован при загрузке класса, поэтому я думаю, что он никогда не будет равен нулю. Но почему это происходит и что я должен сделать, чтобы это исправить? Я что-то упускаю?
Комментарии:
1. Кроме того, хранение данных для каждого запроса, таких как идентификатор входа в систему, в глобальном состоянии (хотя и локально по потоку, но, тем не менее, потенциально сохраняется после завершения запроса) не такая хорошая идея.
Ответ №1:
данные контекста должны быть инициализированы при загрузке класса, поэтому я думаю, что они никогда не будут равны нулю
contextData
инициализируется при загрузке класса; но на самом деле вы не даете ему значения (для каждого потока), по крайней мере, в показанном коде.
Укажите ThreadLocal
начальное значение с помощью заводского метода, например:
public static final ThreadLocal<Map<String, Object>> contextData =
ThreadLocal.withInitial(HashMap::new);