如何在没有请求对象的情况下获取PortletPreferences

时间:2017-10-17 20:34:42

标签: jsf portlet websphere-portal

我需要启动一个使用PortletPreferences对象的TimerTask。

这就是我现在所拥有的(MyUpdateTask扩展TimerTask):

@ManagedBean(name = "myManagedBean", eager = true)
@ApplicationScoped
public class MyManagedBean implements Serializable {
    static MyUpdateTask updateTask;

    @PostConstruct
    public void init(){
        try {
            PortletPreferences portletPrefs = ((PortletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getPreferences();
            updateTask = new MyUpdateTask(portletPrefs);
            MyTaskService.getInstance().update(updateTask);
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
    }
}

MyTaskService.update使用ScheduledExecutorService生成服务以定期更新我的数据。

我现在遇到的问题是((PortletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getPreferences();会抛出 UnsupportedOperationException ,因为目前没有请求。如何在没有请求的情况下获取PortletPreferences?

我确实需要一个PortletPreferences对象来完成任务。

1 个答案:

答案 0 :(得分:3)

如果您使用的是Liferay Portal,那么......

在portlet生命周期的RENDER_PHASE期间,Liferay Portal执行render_portlet.jsp(为PortletPreferences设置RenderRequest对象)。 Lines 52-54 of render_portlet.jsp看起来像这样:

PortletPreferencesIds portletPreferencesIds =
    PortletPreferencesFactoryUtil.getPortletPreferencesIds(request, portletId);
PortletPreferences portletPreferences =
    PortletPreferencesLocalServiceUtil.getStrictPreferences(portletPreferencesIds);

因此,我建议您调用其中一个重载的PortletPreferencesFactoryUtil.getPortletPreferencesIds(...)方法,这些方法采用request对象,以便检索与portlet关联的首选项。

由于您无权访问PortletConfig,因此需要将portletId硬编码为String常量。如果你需要动态获取portletId,而不是@ApplicationScoped bean,你可能@Override GenericFacesPortlet.init(PortletConfig)并从那里启动TimerTask。

否则,如果不使用Liferay Portal,那么我不知道Portlet API的任何部分可以让您在PortletPreferences的上下文之外访问PortletRequest