2017-10-17 4 views
1

Ich muss eine TimerTask starten, die ein PortletPreferences-Objekt verwendet.So erhalten Sie PortletPreferences ohne ein Anforderungsobjekt

hier ist, was ich habe jetzt (MyUpdateTask hier erstreckt 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 einen ScheduledExecutorService verwendet, die einen Dienst erzeugt regelmäßig auf meine Daten zu aktualisieren.

das Problem, das ich gerade habe, ist, dass ((PortletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getPreferences(); wirft UnsupportedOperationException, weil es derzeit keine Anfrage gibt. Wie kann ich PortletPreferences ohne eine Anfrage erhalten?

Ich brauche ein PortletPreferences-Objekt für die Aufgabe.

Antwort

2

Wenn Sie Liferay Portal verwenden, dann ...

Während der RENDER_PHASE des Portlets Lebenszyklus führt Liferay Portal render_portlet.jsp (die die PortletPreferences-Objekt für die RenderRequest einrichtet). Lines 52-54 of render_portlet.jsp sieht wie folgt aus:

PortletPreferencesIds portletPreferencesIds = 
    PortletPreferencesFactoryUtil.getPortletPreferencesIds(request, portletId); 
PortletPreferences portletPreferences = 
    PortletPreferencesLocalServiceUtil.getStrictPreferences(portletPreferencesIds); 

So empfehle ich Ihnen, eine der überladenen PortletPreferencesFactoryUtil.getPortletPreferencesIds(...) Methoden aufrufen, die nicht nehmen request Objekt tun, um die Präferenzen mit dem Portlet zugeordnet abzurufen.

Da Sie keinen Zugriff auf die haben, müssten Sie die PortletId als String Konstante fest codieren. Wenn Sie die PortletId dynamisch beziehen müssen, dann könnten Sie anstelle einer @ApplicationScoped Bean möglicherweise @Override GenericFacesPortlet.init(PortletConfig) und starten Sie die TimerTask von dort.

Ansonsten, wenn ich nicht das Liferay Portal nutze, dann ist mir kein Teil der Portlet-API bekannt, die Ihnen den Zugriff auf die PortletPreferences außerhalb des Kontexts einer PortletRequest ermöglichen würde.

+0

Wenn Sie die Timereinstellung nicht dynamisch ändern müssen, können Sie alternativ auch eine '' verwenden. Dann könnten Sie die Einstellungen in Ihrer Bean erhalten, indem Sie 'FacesContext.getCurrentInstance(). GetExternalContext.getInitParam (" myTimerSetting ")' stattdessen aufrufen. – stiemannkj1

+0

Leider verwende ich derzeit kein Liferay Portal. Ich verwende WebSphere – Sirmyself

+0

. Möglicherweise möchten Sie sehen, ob WebSphere Portal über eine herstellerspezifische/proprietäre API verfügt, die der oben beschriebenen Liferay PortletPreferencesFactoryUtil ähnelt. –

Verwandte Themen