如何在没有请求对象的情况下获得PortletPreferences
我需要启动一个使用PortletPreferences对象的TimerTask。如何在没有请求对象的情况下获得PortletPreferences
这里就是我现在(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对象。
如果使用Liferay门户,那么......
在门户生命周期的RENDER_PHASE
,Liferay门户执行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
对象,以检索与门户相关的喜好之一。
由于您无权访问PortletConfig
,因此您需要将portletId硬编码为String
常量。如果您需要动态获取portletId,那么您可以使用@Override GenericFacesPortlet.init(PortletConfig)
而不是@ApplicationScoped
bean,然后从那里启动TimerTask。否则,如果不使用Liferay Portal,那么我不知道Portlet API的任何部分可以让您访问PortletRequest
上下文外的PortletPreferences
。
或者,如果您不需要动态修改计时器设置,则可以使用“”代替。然后,您可以通过调用'FacesContext.getCurrentInstance()。getExternalContext.getInitParam(“myTimerSetting”)'来获得bean中的设置。 –
stiemannkj1
不幸的是,我目前没有使用Liferay Portal。我正在使用WebSphere – Sirmyself
您可能想看看WebSphere Portal是否具有与上述Liferay的PortletPreferencesFactoryUtil类似的供应商特定/专用API。 –