Мы столкнулись с проблемой использования Spring Portlet MVC 3.1 при использовании нескольких классов контроллеров и DefaultAnnotationHandlerMapping.Как портлет MVC 3.1 Spring определяет, какой аннотированный метод визуализировать с несколькими контроллерами?
фон
- Мы используем Spring Portlet MVC 3.1 с аннотациями для визуализации & действий фазы
- Мы используем JBoss EPP 5.1.1
Выпуск
- Для визуализации портлета запрос с Params, неправильная страница отображается в окне портала
Причина
- Spring Portlet MVC использует другой метод @RenderMapping, чем ожидаемый метод с правильные аннотации
Технический анализ
Все наши контроллеры содержат аннотации @RenderMapping и @ActionMapping, и у всех есть аргументы «params», чтобы гарантировать, что ожидаемый метод вызывается на основе набора параметров в наших URL-адресах портлета. Для рендеринга по умолчанию у нас есть метод с аннотацией @RenderMapping без аргумента «params», который мы используем для визуализации пустого JSP, когда запрос не содержит параметров.
Основываясь на чтении главы 7 и 8 в вашей книге, мы узнали, что портлет диспетчера пытается получить соответствующее сопоставление обработчика для входящего запроса и отправить его соответствующему методу в настроенном компоненте контроллера. Наше предположение заключалось в том, что аннотация по умолчанию @RenderMapping (без параметров) вызывается только после того, как она проверила, что в контроллерах нет других методов с аннотацией, которая соответствует конкретным параметрам запроса.
Однако мы отлаживались, чтобы понять, что это предположение неверно. Кажется, что DefaultAnnotationHandlerMapping пересекает доступный список аннотаций в компонентах Controller в некотором заданном порядке. Это означает, что если в списке появится компонент контроллера с аннотацией по умолчанию @RenderMapping (без параметров), в этом случае будет вызван метод с аннотацией по умолчанию @RenderMapping (без параметров), а не с правильным, что дальше по списку ,
Проявленная Ошибка
Мы разрабатываем в среде Windows, и развертывания в среде Linux. В Windows мы видим, что обработчик циклически перебирает компоненты контроллера в алфавитном порядке, поэтому мы сначала решили нашу проблему, добавив аннотированный метод @RenderMapping без каких-либо параметров в контроллере с именем bean, ближайшим к «Z».
В Linux, однако, похоже, что компоненты контроллера обнаружены в другом порядке. Я приложил журналы Spring ниже, чтобы выделить проблему. Аннотации no params @RenderMapping находятся в контроллере YourDetailsController, и, как вы можете видеть в журнале Windows, он отображается последним в списке, тогда как в Linux это не так. Это означает, что, если мы попытаемся получить доступ к одному из контроллеров, который появляется после этого в списке, то вместо этого вместо этого вы попадаете в аннотацию no params в YourDetailsController.
Вопросы
- Является ли наше предположение неверно?
- Означает ли наш диагноз ожидаемое поведение? Или это ошибка с Spring Portlet MVC?
- Есть ли другой способ получить аннотации, отсканированные для составления списка компонентов списка ручной работы?
- Будет ли использовать xml-конфигурацию (вместо аннотаций) удалить нашу проблему?
- Можем ли мы определить множественное отображение и порядок обработки, чтобы сопоставление обработчика по умолчанию являлось последним отображением обработчика, используемым портлетом диспетчера?
Любые мысли или советы, которые у вас есть по этой проблеме, будут очень признательны.
Чья книга? Какие журналы? – beerbajay
Портлеты в действии Ашиш Сарин. – user1372549
JBoss сервер журналы – user1372549