Это очень странно для меня:
1) У меня есть класс
public class Data {
private static String name; public static String getName() {
return name;
} public static void setName (String n){
Data.name = n;
}
}
это имя переменной класса правильно настроено во время моего сервера (запуск J2EE в WAS liberty) - я хотел кэшировать эти данные в течение всего жизненного цикла сервера.
2), но когда я ударил URL-адрес, который в конечном итоге вызывает код, который делает getter:
Data.getName(); // this returns null??
Может ли кто-нибудь подумать о возможной причине? Невозможно также отлаживать, я очень расстроен.
Чтобы проиллюстрировать мою проблему больше, позвольте мне показать мою структуру проекта:
EAR
CommonJar
WAR1 WAR2
My Data.java находится в CommonJar. Этот Data.java инициализируется в WAR1 во время запуска сервера, вызванного Listener, зарегистрированным в web.xml, и отсюда я увидел, что он установлен, и я увидел ненулевое значение, используя Data.getName (). Это мой шаг 1 в моем первоначальном сообщении.
Затем у меня есть спокойная служба HelloWorld в WAR2. И когда я звоню в эту службу HelloWorld, я вижу, что Data.getName () возвращает null. - Это мой шаг 2 в моем оригинальном посте. Даже не думайте о синтаксическом типе простой ошибки, потому что это не так.
Моя теория такова: кажется, что Data.java загружается загрузчиком классов в WAR1 на шаге 1, а затем WAR 2 в мой шаг 2 и шаг 2 загрузили пустой класс данных.
Чтобы проверить правильность этой теории, я перешел на этап инициализации Data.java в WAR2 (и снова увидел, что он установлен, и я увидел ненулевое значение, использующее Data.getName ()), разница заключается в том, что когда я звоню в эту службу HelloWorld, я видел, что Data.getName () возвращает ожидаемое ненулевое значение. Этот шаг - это то, что я называю своим прорывом в устранении неполадок, потому что, похоже, моя теория была правильной. (но я не могу исправить эту проблему, переместив код в моей реальной проблеме).
Затем возникает вопрос, как исправить и как визуально увидеть, какой класс загружен загрузчиком классов и когда? Кроме того, на основе документа WAS Liberty загрузчик по умолчанию будет иметь parentfirst, что означает, что Data.java должен быть загружен родителем (в данном случае EAR), поэтому у меня не должно быть проблем с первым местом.
Кто-нибудь, пожалуйста, подскажите, как дальше видеть проблему и исправить ее? Спасибо.
Функция getName () объявляется без возвращаемого типа, но пытается вернуть строку.
попробуйте этот