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

Jsf 如何在没有请求对象的情况下获取PortletPreferences,jsf,portlet,websphere-portal,Jsf,Portlet,Websphere Portal,我需要启动一个使用PortletPreferences对象的TimerTask 以下是我现在拥有的(MyUpdateTask在此扩展TimerTask): MyTaskService.update使用ScheduledExecutorService生成定期更新数据的服务 我现在的问题是((PortletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getPreferences()抛出一个不

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

以下是我现在拥有的(MyUpdateTask在此扩展TimerTask):

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

我现在的问题是
((PortletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getPreferences()抛出一个不支持操作异常,因为当前没有请求。如果没有请求,如何获取PortletPreferences


我确实需要任务的PortletPreferences对象

如果您正在使用Liferay Portal,则

在portlet生命周期的
RENDER_阶段
期间,Liferay Portal执行RENDER_portlet.jsp(它为
RenderRequest
设置
PortletPreferences
对象)。像这样:

PortletPreferencesIds portletPreferencesIds =
    PortletPreferencesFactoryUtil.getPortletPreferencesIds(request, portletId);
PortletPreferences portletPreferences =
    PortletPreferencesLocalServiceUtil.getStrictPreferences(portletPreferencesIds);
因此,我建议您调用一个重载的
PortletPreferencesFactoryUtil.getPortletPreferencesIds(…)
方法,该方法不接受
请求
对象,以便检索与portlet关联的首选项

由于您没有访问
PortletConfig
的权限,因此需要将portletId硬编码为
字符串
常量。如果您需要动态获取portletId,那么您可以替代
@ApplicationScoped
bean
@覆盖GenericFacesPortlet.init(PortletConfig)
并从那里启动TimerTask


否则,如果不使用Liferay Portal,那么我不知道Portlet API的任何部分会允许您在
PortletRequest

的上下文之外访问
PortletPreferences
。或者,如果您不需要动态修改计时器设置,您可以使用
。然后,您可以通过调用
FacesContext.getCurrentInstance().getExternalContext.getInitParam(“myTimerSetting”)
来获取bean中的设置。不幸的是,我目前没有使用Liferay Portal。我正在使用WebSpherey您可能想看看WebSphere portal是否有一个特定于供应商/专有的API,类似于上面描述的Liferay的PortletPreferencesFactoryUtil。@先生,您自己应该注意,在portlet的
init()
方法中启动计时器或任务也可能在IBM WebSphere portal中工作。这不是我所做的吗?
PortletPreferencesIds portletPreferencesIds =
    PortletPreferencesFactoryUtil.getPortletPreferencesIds(request, portletId);
PortletPreferences portletPreferences =
    PortletPreferencesLocalServiceUtil.getStrictPreferences(portletPreferencesIds);