Как использовать @RequestMapping с несколькими контроллерами для нескольких портлетов в плагине портлета Liferay

У меня есть файл WAR, содержащий два портлета со своими выделенными контроллерами. Как мне настроить его так, чтобы все контроллеры (методы обработчика) были найдены, когда я запускаю Liferay/вызываю страницу, содержащую два портлета? В portlet.xml оба портлета можно найти с
<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>.

В spring-mvc-portlet.xml я использую <context:component-scan base-package="com.foo.bar" />.

Оба контроллера должны иметь метод обработчика по умолчанию, аннотированный @RenderMapping. Оба контроллера аннотированы @RequestMapping("VIEW") на уровне типа.

В настоящее время происходит то, что вызывается только метод обработчика по умолчанию из контроллера A (первый, определенный в portlet.xml).


person du-it    schedule 01.01.2014    source источник
comment
Я решил проблему, и этот способ работает для меня:   -  person du-it    schedule 02.01.2014


Ответы (2)


Во-первых, я бы посоветовал вам иметь каждый портлет (контроллеры) в отдельных пакетах.

Для каждого портлета у вас должен быть файл spring xml с именем «portlet-name» из portlet.xml. Поэтому, если у вас есть <portlet-name>my-first-portlet</portlet-name>, у вас должен быть myfirstportlet-portlet.xml в WEB-INF, который имеет компонент- элемент сканирования.

person Martin Gamulin    schedule 02.01.2014
comment
Спасибо, Мартин. Этого недостаточно, и я думаю, что не требуется так называть файлы (тем не менее, хорошая идея для именования). Пока я правильно редактирую элемент contextConfigLocation в соответствующем портлете в portlet.xml, файлы могут иметь имя по вашему желанию. - person du-it; 02.01.2014
comment
Spring будет автоматически искать файлы с именами, как описано в ответе, или вы можете использовать contextConfigLocation. Ваше здоровье - person Martin Gamulin; 02.01.2014
comment
Ах! Хорошо. Интересный. Спасибо. - person du-it; 02.01.2014

Проблема решена!

Я решил проблему, и у меня работает этот способ:
Мне пришлось поместить каждый контроллер в свой пакет. Чтобы Liferay знал об этом, мне пришлось настроить portlet.xml таким образом, чтобы дать каждому портлету, указанному в списке, выделенную конфигурацию контекста. Таким образом, я скопировал <myPortlet>-portlet.xml, правильно переименовал его в <myOtherPortlet>-portlet.xml и поместил это имя в элемент contextConfigParam <init-param> в portlet.xml. В файлах конфигурации контекста мне пришлось изменить элемент context:component-scan следующим образом, чтобы исключить игнорирование другого контроллера для этого контроллера. Например, в XML-файле конфигурации контекста для моего ListController я должен исключить ImportController следующим образом:

<context:component-scan base-package="com.foo.bar" use-default-filters="true">
    <context:exclude-filter type="assignable" expression="com.foo.bar.importer.portlet.ImportController"/>
</context:component-scan>

... и в XML-файле конфигурации контекста для ImportController я должен соответственно исключить ListController.

person du-it    schedule 02.01.2014