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