2017-10-17 144 views
1

我需要启动一个使用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对象。

回答

2

如果使用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

+0

或者,如果您不需要动态修改计时器设置,则可以使用“”代替。然后,您可以通过调用'FacesContext.getCurrentInstance()。getExternalContext.getInitParam(“myTimerSetting”)'来获得bean中的设置。 – stiemannkj1

+0

不幸的是,我目前没有使用Liferay Portal。我正在使用WebSphere – Sirmyself

+0

您可能想看看WebSphere Portal是否具有与上述Liferay的PortletPreferencesFactoryUtil类似的供应商特定/专用API。 –

相关问题