2017-10-17 19 views
1

Je dois démarrer un TimerTask qui utilise un objet PortletPreferences.Comment obtenir un PortletPreferences sans objet de requête

voici ce que j'ai pour l'instant (MyUpdateTask étend ici 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 utilise un ScheduledExecutorService qui génère un service de mettre à jour régulièrement mes données. Le problème que j'ai en ce moment est que ((PortletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getPreferences(); jette un UnsupportedOperationException parce qu'il n'y a actuellement aucune demande. Comment puis-je obtenir une PortletPreferences sans demande?

J'ai besoin d'un objet PortletPreferences pour la tâche.

Répondre

2

Si vous utilisez Liferay Portal, puis ...

Pendant la RENDER_PHASE du cycle de vie de portlet, Liferay Portal exécute render_portlet.jsp (qui met en place l'objet PortletPreferences pour la RenderRequest). Lines 52-54 of render_portlet.jsp ressembler à ceci:

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

Je recommande donc que vous appelez l'une des méthodes PortletPreferencesFactoryUtil.getPortletPreferencesIds(...) surchargées qui ne pas prendre un objet request afin de récupérer les préférences associées au portlet.

Étant donné que vous n'avez pas accès au PortletConfig, vous devez coder le portletId en tant que constante String. Si vous avez besoin d'obtenir le portletId de manière dynamique, alors à la place d'un bean @ApplicationScoped vous pouvez éventuellement @Override GenericFacesPortlet.init(PortletConfig) et démarrer le TimerTask à partir de là.

Sinon, si vous n'utilisez pas Liferay Portal, je ne connais aucune partie de l'API Portlet qui vous permettrait d'accéder au PortletPreferences en dehors du contexte d'un PortletRequest.

+0

Alternativement, si vous n'avez pas besoin de modifier dynamiquement le réglage de la minuterie, vous pouvez utiliser un '' à la place. Ensuite, vous pouvez obtenir les paramètres dans votre bean en appelant 'FacesContext.getCurrentInstance(). GetExternalContext.getInitParam (" myTimerSetting ")' à la place. – stiemannkj1

+0

Malheureusement, je n'utilise pas actuellement Liferay Portal. J'utilise WebSphere – Sirmyself

+0

Vous pouvez vérifier si le portail WebSphere dispose d'une API propriétaire/spécifique au fournisseur similaire à PortletPreferencesFactoryUtil de Liferay décrite ci-dessus. –