我需要启动一个使用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对象来完成任务。
答案 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
。