Отличия при запуске Tomcat из Intellij IDEA? - PullRequest
2 голосов
/ 11 апреля 2011

У меня очень странная проблема с приложением Spring 3.5, Webflow 2.2, запущенным в Tomcat (6.0.32)

Часть вызовов веб-потока для получения списка объектов.Этот список помещается в объект viewScope для использования представлением JSP.Каждый объект в этом списке наследуется от базового класса, который содержит некоторые общие поля.

Затем веб-поток переходит к представлению JSP, отображающему содержимое этого списка, записывая все объекты.

Когда я запускаю это из отдельного Tomcat, все поля базового класса как-то устанавливаются в нуль.Я отладил и подтвердил, что список построен правильно из кода, вызываемого веб-потоком.Таким образом, где-то между помещением списка в область просмотра веб-потока и последующим извлечением его JSP, поля базового класса обнуляются.

ДЕЙСТВИТЕЛЬНО причудливая часть проблемы заключается в том, что приложение запускаетсяпрекрасно, если я запускаю и запускаю Tomcat из Intellij IDEA.Я пробовал разные версии JDK и Tomcat, и у всех одна и та же проблема.

Кажется, это проблема веб-потока (может быть, неправильная сериализация?), Чувствительная к тому, запущен ли Tomcat из IntelliJ.

Что делает IntelliJ, что может привести к неправильной работе сериализации Java?

Ответы [ 2 ]

4 голосов
/ 14 апреля 2011

Ну, я не нашел точную причину, но у меня есть обходной путь.Я просто реализовал пользовательские методы сериализации объектов - private void writeObject () и readObject () - на объектах, которые таинственным образом не сериализовались должным образом, и все начало работать.В базовом классе есть только пара простых типов (пара long и String), так что в этом нет ничего сложного.

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

Класс атрибута -> общий базовый класс -> корневой базовый класс

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

Я все еще точно не знаю, почему.И я до сих пор не знаю, почему, когда я запустил Tomcat из IntelliJ, сериализация работала, как и ожидалось.Очень странно.


ОБНОВЛЕНИЕ: Нашли виновника.Действительно плохой скрипт сборки Ant, скрывающий отсутствующий «сериализуемый» маркер интерфейса.

Данная система на самом деле довольно большая и имеет неприятный, трудный для понимания скрипт сборки Ant.Я предполагал, что это делает полную, правильную чистую сборку.В иерархии классов, которую я показал выше, класс Attribute и Root Base Class находились в разных банках.А банка, содержащая корневой базовый класс, фактически кэшировалась и не перестраивалась должным образом.

В более старой (неправильной) версии развертываемого базового класса не было «сериализуемого» интерфейса маркера (класс Attribute имел).Поэтому, конечно, его поля не были сериализованы.Когда я тестировал из IntelliJ, он делал сборку и развертывание прямо из моих источников.

Я чувствую себя действительно глупым.

1 голос
/ 14 апреля 2011

Я встречал такого рода явления в различных IDE, когда создавал WAR с помощью IDE, и при работе в IDE он использовал другие кэшированные классы, чем при работе вне IDE. Чтобы сузить явления, попробуйте следующее:

Если вы этого еще не сделали, создайте сборку Ant или Maven для своего проекта. Очистите все файлы .class и другие артефакты, закройте intellij, создайте WAR с помощью Ant или Maven и попробуйте развернуть его в Tomcat. Посмотрим, получится ли у вас странное поведение.

Далее попробуйте запустить сервер Tomcat в Intellij, но не развертывайте на нем свое приложение из Intellij. Разверните в нем свое приложение, добавив войну в экземпляр Intellij Tomcat в файловой системе.

Наконец, не запускайте Tomcat из Intellij, но запустите его извне и подключитесь к нему с помощью удаленной отладки, а затем посмотрите, возникает ли проблема. Ниже описано, как настроить удаленную отладку: http://wiki.apache.org/tomcat/FAQ/Developing.

...