Liferay Hook - 操作请求参数

时间:2015-03-09 12:33:20

标签: liferay struts liferay-6 liferay-hook

我遇到了一个钩子的问题。 SZENARIO:

  • 只要用户将文档上传到文档库,Hook就会覆盖调用的struts action /document_library/edit_file_entry
  • 目标是检查文档的title并按照给定的命名方案重命名。

我的解决方案:

@Override
public void processAction(
        StrutsPortletAction originalStrutsPortletAction,
        PortletConfig portletConfig, ActionRequest actionRequest,
        ActionResponse actionResponse)
    throws Exception {

    //Get old title - set new title
    String oldTitle =  ParamUtil.getString(actionRequest, "title");
    String newTitle = "Test";

    //wrap request to set param
    DynamicActionRequest actionRequestNew = new DynamicActionRequest(actionRequest);
    actionRequestNew.setParameter("title", newTitle );

    //call original struts action with modified title
    originalStrutsPortletAction.processAction(originalStrutsPortletAction, portletConfig,  actionRequestNew, actionResponse);

}

问题是portal-impl/src/com/liferay/portlet/documentlibrary/action/EditFileEntryAction.java中的原始Struts操作使用的PortalUtil.getUploadPortletRequest(actionRequest);需要PortletRequestImpl

DynamicActionRequest无法投放到PortletRequestImpl

请参阅:

12:07:04,466 ERROR [http-bio-8082-exec-44][render_portlet_jsp:154] java.lang.ClassCastException: com.liferay.portal.kernel.portlet.DynamicActionRequest cannot be cast to com.liferay.portlet.PortletRequestImpl
    at com.liferay.portal.util.PortalImpl.getUploadPortletRequest(PortalImpl.java:4067)
    at com.liferay.portal.util.PortalUtil.getUploadPortletRequest(PortalUtil.java:1253)
    at com.liferay.portlet.documentlibrary.action.EditFileEntryAction.updateFileEntry(EditFileEntryAction.java:653)
    at com.liferay.portlet.documentlibrary.action.EditFileEntryAction.processAction(EditFileEntryAction.java:129)
    at com.liferay.portal.struts.StrutsPortletActionAdapter.processAction(StrutsPortletActionAdapter.java:51)
    at com.liferay.portal.kernel.struts.BaseStrutsPortletAction.processAction(BaseStrutsPortletAction.java:42)
    at com.foo.hook.portlet.sites.action.MyEditFileEntryAction.processAction(MyEditFileEntryAction.java:83)
    at com.liferay.portal.kernel.bean.ClassLoaderBeanHandler.invoke(ClassLoaderBeanHandler.java:67)
    at com.liferay.portal.struts.PortletActionAdapter.processAction(PortletActionAdapter.java:55)
    at com.liferay.portal.struts.PortletRequestProcessor.process(PortletRequestProcessor.java:169)
    at com.liferay.portlet.StrutsPortlet.processAction(StrutsPortlet.java:212)
    at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:70)
    at com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:48)
    at com.liferay.portlet.InvokerPortletImpl.invoke(InvokerPortletImpl.java:548)
    at com.liferay.portlet.InvokerPortletImpl.invokeAction(InvokerPortletImpl.java:579)
    at com.liferay.portlet.InvokerPortletImpl.processAction(InvokerPortletImpl.java:294)
    at com.liferay.portal.action.LayoutAction.processPortletRequest(LayoutAction.java:944)
    at com.liferay.portal.action.LayoutAction.processLayout(LayoutAction.java:688)
    at com.liferay.portal.action.LayoutAction.execute(LayoutAction.java:249)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)

如何在不使用DynmicActionRequest的情况下更改参数?有什么建议吗?

我正在运行Liferay-Portal 6.1.20 EE。

提前致谢。

2 个答案:

答案 0 :(得分:-1)

我能想到两种方法。

1)创建ActionRequestWrapper对象并添加参数。这可能会解决您的问题。

2)创建LR的动作类的子类。在那里使所需的代码更改。创建一个钩子并使新的动作类可用于LR。

我希望这会有所帮助。

答案 1 :(得分:-4)

您可以在现有actionRequest中设置参数:

actionRequest.setParameter("title", newTitle);

它将以新值更新。