2013-11-20 2 views
3

Я использую Liferay и Spring MVC, и я хочу, чтобы перенаправить на другой портлет и передать ему параметр, но когда я пытаюсь установить параметры отображения Я получаю эту ошибку:Перенаправление на другой портлет с ActionMapping

15:20:24,859 ERROR [portal-web.docroot.html.portal.render_portlet_jsp] (http-foo-10.23.243.3-8080-7) java.lang.IllegalStateException: Set render parameter has already been called

at com.liferay.portlet.ActionResponseImpl.sendRedirect(ActionResponseImpl.java:48) at sk.foo.showcasePortlet.ShowcaseController.redirect(ShowcaseController.java:65)

метод в showcaseController, которая решается содержит только и присваивание редиректа:

@ActionMapping(params = { "action=redirect" }) 
public void redirect(ActionRequest request, ActionResponse response) 
    throws IOException { 

    response.setRenderParameter("path", request.getParameter("path")); 
    response.sendRedirect("/path/to/portlet"); 
} 

Почему я не могу назначить этот параметр? Когда я удалить строку перенаправление работает, но проблема в том, что портлет, который пользователь перенаправляется ожидает строку параметра «путь»:

@RenderMapping 
public String barBaz(RenderRequest request, @RequestParam String path){ 
    // ... 
    return "some/jsp"; 
} 

Как я могу передать параметр методу barBaz в другой портлет, пожалуйста?

ответ

3

Вы исключением говорит, что это IllegalStateException: Установите параметр визуализации уже назвали

Имейте в виду, что этот перехватчик звонит setRenderParameter на ActionResponse, что означает, что вы не можете вызвать sendRedirect в обработчике при использовании этого перехватчика. Если вам нужно сделать внешние переадресовывает, то вам нужно будет либо направить параметр отображения вручную или написать другой перехватчик, чтобы справиться с этим для вас

DOC

+0

что, если я прохожу его с response.setProperty («путь», «somePath»), другой портлет сможет получить его с request.getProperty («путь»)? (если это не @RequestParam) – Dropout

+0

Нет, вы не можете сделать это хорошо. Фактически свойства могут использоваться портлетами для предоставления конкретной информации о поставщике на портале. Они различаются для поставщиков серверов портала. Простой способ использования сеанса. request.getSession(). на объекте сеанса вы можете установить атрибуты. session.setAttribute ("portletscopeattribute", "portletscopevalue", PortletSession.PORTLET_SCOPE); Также вы можете использовать события. –

+0

Тогда я буду использовать сеанс. Большое спасибо! – Dropout