2016-04-25 4 views
0

Я пытаюсь реализовать SessionListener, который планирую использовать для регистрации активных пользовательских сеансов (имя/время), чтобы я мог сообщить менеджеру, кто все доступен в любое время. Однако, когда я добавляю его, я вижу сообщение sessionCreated, а затем вижу эту ошибку JVM на консоли сервера. После него не запускается Java-код.SessionListener вызывает ExceptionInInitializerError

HTTP JVM: com.ibm.xsp.webapp.FacesServlet $ ExtendedServletException: Ошибка типа не найдено:: java.lang.ExceptionInInitializerError HTTP JVM импорт java.lang.ExceptionInInitializerError javax.servlet.http.HttpSessionEvent ;

Вот мой SessionTracker.java:

import com.ibm.xsp.application.ApplicationEx; 
import com.ibm.xsp.application.events.SessionListener; 

public class SessionTracker implements SessionListener { 

    public void sessionCreated(ApplicationEx arg0, HttpSessionEvent arg1) { 
     System.out.println("***session created***"); 
    } 

    public void sessionDestroyed(ApplicationEx arg0, HttpSessionEvent arg1) { 
     System.out.println("***session destroyed ***"); 
    } 
} 

Вот что я вижу в xpages_exec * .log в директории IBM_TECHNICAL_SUPPORT.

Контекст: /igdmnext/igdm.nsf страницу: /Services.xsp java.lang.ExceptionInInitializerError на java.lang.J9VMInternals.initialize (J9VMInternals.java:221) в java.lang. J9VMInternals.newInstanceImpl (Родной метод) при java.lang.Class.newInstance (Class.java:1688) при com.ibm.xsp.util.ManagedBeanUtil.getBean (ManagedBeanUtil.java:61) при com.ibm.xsp .extlib.component.rest.CustomService.findBeanInstance (CustomService.java:225) at com.ibm.xsp.extlib.component.rest.CustomService $ ScriptServiceEngine.renderService (CustomService.java:257) в com.ibm.domino.services.HttpServiceEngine.processRequest (HttpServiceEngine.java:170) на com.ibm.xsp.extlib.component.rest.UIBaseRestService._processAjaxRequest (UIBaseRestService.java:259) в ком .ibm.xsp.extlib.component.rest.UIBaseRestService.processAjaxRequest (UIBaseRestService.java:236) на com.ibm.xsp.util.AjaxUtilEx.renderAjaxPartialLifecycle (AjaxUtilEx.java:206) на com.ibm.xsp .webapp.FacesServletEx.renderAjaxPartial (FacesServletEx.java:249) на com.ibm.xsp.webapp.FacesServletEx.serviceAjaxPartialView (FacesServletEx.java:200) на com.ibm.xsp.webapp.FacesServletEx .serviceAjaxPartialViewSync (FacesServletEx.java:169) на com.ibm.xsp.webapp.FacesServletEx.serviceView (FacesServletEx.java:155) в com.ibm.xsp.webapp.FacesServlet.service (FacesServlet.java:160) на com.ibm.xsp.webapp.FacesServletEx.service (FacesServletEx.java:138) при com.ibm.xsp.webapp.DesignerFacesServlet.service (DesignerFacesServlet.java:103) в com.ibm.designer.runtime .domino.adapter.ComponentModule.invokeServlet (ComponentModule.java:576) на com.ibm.domino.xsp.module.nsf.NSFComponentModule.invokeServlet (NSFComponentModule.java:1335) на com.ibm.designer.runtime .domino.adapter.ComponentModule $ AdapterInvoker.invokeServlet (ComponentModule .java: 853) на com.ibm.designer.runtime.domino.adapter.ComponentModule $ ServletInvoker.doService (ComponentModule.java:796) в com.ibm.designer.runtime.domino.adapter.ComponentModule.doService (ComponentModule.java:565) по адресу com.ibm.domino.xsp.module.nsf.NSFComponentModule.doService (NSFComponentModule.Java: 1 319) на com.ibm.domino.xsp.module.nsf.NSFService.doServiceInternal (NSFService.java:662) на com.ibm.domino.xsp.module.nsf.NSFService.doService (NSFService. Java: 482) на com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService (LCDEnvironment.java:357) на com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service (LCDEnvironment. Java: 313) на com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service (XspCmdManager.java:272) Вызванный: java.lang.NullPointerException на org.openntf.domino.xsp. session.AbstractXPageSessionFactory.wrapSession (AbstractXPageSessionFactory.java:23) в org.openntf.domino.xsp.session.XPageSignerSessionFactory.createSession (XPageSignerSessionFactory.java:18) в org.openntf.domino.utils.Factory.getSession (Factory.java:952) при com.hcl. igdm.util.EndUserMap. (EndUserMap.java:46) -> это мой пользовательский класс java, который работает, если я не реализую SessionTracker выше по адресу java.lang.J9VMInternals.initializeImpl (собственный метод) в java.lang .J9VMInternals.initialize (J9VMInternals.java:199) ... 27 более

** EndUserMap.java **

package com.hcl.igdm.util; 

import java.io.PrintWriter; 
import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
import java.util.TreeMap; 

import javax.faces.context.FacesContext; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.lang.StringUtils; 
import org.openntf.domino.Database; 
import org.openntf.domino.Session; 
import org.openntf.domino.View; 
import org.openntf.domino.ViewEntry; 
import org.openntf.domino.ViewEntryCollection; 
import org.openntf.domino.utils.Factory; 
import org.openntf.domino.utils.Factory.SessionType; 

import com.hcl.igdm.Activity; 
import com.hcl.igdm.Phases; 
import com.hcl.igdm.Stages; 
import com.ibm.commons.util.StringUtil; 
import com.ibm.commons.util.io.json.JsonJavaArray; 
import com.ibm.commons.util.io.json.JsonJavaObject; 
import com.ibm.domino.services.ServiceException; 
import com.ibm.domino.services.rest.RestServiceEngine; 
import com.ibm.xsp.extlib.component.rest.CustomService; 
import com.ibm.xsp.extlib.component.rest.CustomServiceBean; 
import com.ibm.xsp.extlib.util.ExtLibUtil; 

/** 
* @author agnihotri.a 
* 
*/ 
public class EndUserMap extends CustomServiceBean implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private static String requestedType = ""; 
    static Session session = Factory.getSession(SessionType.NATIVE); 
    static Database db = session.getCurrentDatabase(); 
    static View allView = db.getView("mapAll"); 

    public static void setRequestedType(String requestType) { 
     requestedType = requestType; 
    } 

    public static String getRequestedType() { 
     return requestedType; 
    } 

    @Override 
    public void renderService(CustomService service, RestServiceEngine engine) throws ServiceException { 
     HttpServletRequest request = engine.getHttpRequest(); 
     HttpServletResponse response = engine.getHttpResponse(); 

     response.setHeader("Content-Type", "application/json; charset=UTF-8"); 
     response.setContentType("application/json"); 
     response.setCharacterEncoding("UTF-8"); 
     FacesContext faccon = FacesContext.getCurrentInstance(); 

     /**** read requested type from query string parameters ****/ 
     String reqType = request.getParameter("type"); 

     try { 
      JsonJavaObject jjo = new JsonJavaObject(); 
      PrintWriter pw = response.getWriter(); 
      if (reqType.equalsIgnoreCase("Map") || "".equalsIgnoreCase(reqType)) { 
       setRequestedType("Map"); 
       pw.write(getEndUserMap().toString()); 

      } else if (reqType.equalsIgnoreCase("Activity")) { 
       setRequestedType("Activity"); 
       request.getParameter("ukey"); 
       try { 
        jjo = getActivity(request.getParameter("ukey")); 
        // jjo.put("map", getEndUserMap()); 
        pw.write(jjo.toString()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } else if (reqType.equalsIgnoreCase("Phase")) { 
       request.getParameter("ukey"); 
       try { 
        setRequestedType("Phase"); 
        jjo = getPhase(request.getParameter("ukey")); 
        jjo.put("map", getEndUserMap()); 
        pw.write(jjo.toString()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } else if (reqType.equalsIgnoreCase("Stage")) { 
       request.getParameter("ukey"); 
       try { 
        setRequestedType("Stage"); 
        jjo = getStage(request.getParameter("ukey")); 
        // jjo.put("map", getEndUserMap()); 
        pw.write(jjo.toString()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

      pw.flush(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     faccon.responseComplete(); 

    } 

    public static JsonJavaObject getActivity(String ukey) throws Exception { 
     Activity activity = new Activity(); 
     activity.load(ukey); 
     JsonJavaObject jjo = new JsonJavaObject(); 
     if (!isAdmin() && !StringUtil.equalsIgnoreCase((String) activity.getValue("Status"), "Live")) { 
      jjo.put("error", "You are not authorized to view this document."); 
      return jjo; 
     } 
     jjo.put("title", activity.getValue("Title")); 
     jjo.put("teaser", activity.getValue("Teaser")); 
     jjo.put("ukey", activity.getUnid()); 
     jjo.put("overview", activity.getValue("Overview")); 
     jjo.put("inputs", activity.getValue("Inputs")); 
     jjo.put("outputs", activity.getValue("Outputs")); 
     jjo.put("order", activity.getValue("SortOrder")); 
     jjo.put("artefacts", activity.getArtefacts()); 
     jjo.put("kmlinks", activity.getValue("KMLinks")); 
     jjo.put("kmenabled", activity.getValue("KMEnabled")); 
     jjo.put("resources", activity.getResources()); 
     TreeMap<String, ArrayList<String>> mappings = Mappings.loadMyMap(ukey); 
     if (!mappings.isEmpty()) { 
      if (mappings.containsKey("Substage")) { 
       // jjo.put("substage", mappings.get("Substage").get(0)); 
       jjo.put("substage", getStage(mappings.get("Substage").get(0))); 
      } else if (mappings.containsKey("Stage")) { 
       // jjo.put("stage", mappings.get("Stage").get(0)); 
       jjo.put("stage", getStage(mappings.get("Stage").get(0))); 
      } 
     } 
     return jjo; 
    } 

    public static JsonJavaObject getStage(String ukey) { 

     Stages stage = new Stages(); 
     stage.load(ukey); 
     String stageType = (String) stage.getValue("StageType"); 
     JsonJavaObject jjo = new JsonJavaObject(); 
     if (!isAdmin() && !StringUtil.equalsIgnoreCase((String) stage.getValue("Status"), "Live")) { 
      jjo.put("error", "You are not authorized to view this document."); 
      return jjo; 
     } 
     TreeMap<String, ArrayList<String>> mappings = Mappings.loadMyMap(ukey); 

     jjo.put("title", stage.getValue("Title")); 
     jjo.put("ukey", stage.getUnid()); 
     jjo.put("overview", stage.getValue("Overview")); 
     jjo.put("order", stage.getValue("Row")); 
     jjo.put("type", stageType); 
     jjo.put("status", (String) stage.getValue("Status")); 

     if (!mappings.isEmpty()) { 

      if (mappings.containsKey("Stream")) { 
       JsonJavaArray mapStreamJJA = new JsonJavaArray(); 
       for (String key : mappings.get("Stream")) { 
        try { 
         Map<String, Object> entryMap = allView.getFirstEntryByKey(key).getColumnValuesMap(); 
         if ("Live".equalsIgnoreCase((String) entryMap.get("status")) || isAdmin()) { 
          mapStreamJJA.add(entryMap); 
         } 

        } catch (Exception ex) { 
         // do nothing 
        } 
       } 
       jjo.put("stream", mapStreamJJA); 
      } else { 
       jjo.put("stream", ""); 
      } 
      /** below mapping check handles substages */ 
      if (mappings.containsKey("Stage") && !StringUtils.equalsIgnoreCase(stageType, "Stage")) { 
       JsonJavaArray mapStreamJJA = new JsonJavaArray(); 
       JsonJavaArray mapPhaseJJA = new JsonJavaArray(); 

       // as this is substage ..we'll get phase from parent stage 
       for (String key : mappings.get("Stage")) { 
        try { 
         Map<String, Object> entryMap = allView.getFirstEntryByKey(key).getColumnValuesMap(); 
         if ("Live".equalsIgnoreCase((String) entryMap.get("status")) || isAdmin()) { 
          mapStreamJJA.add(entryMap); 
          TreeMap<String, ArrayList<String>> stageMap = Mappings.loadMyMap(key); 
          if (!stageMap.isEmpty() && stageMap.containsKey("Phase")) { 
           for (String phase : stageMap.get("Phase")) { 
            Map<String, Object> entryMapPhase = allView.getFirstEntryByKey(phase).getColumnValuesMap(); 
            if ("Live".equalsIgnoreCase((String) entryMapPhase.get("status")) || isAdmin()) { 
             mapPhaseJJA.add(entryMapPhase); 
            } 

           } 
          } 
         } 

        } catch (Exception ex) { 
         ex.printStackTrace(); 
        } 
       } 
       jjo.put("stage", mapStreamJJA); 
       jjo.put("phase", mapPhaseJJA); 
      } 

      if (mappings.containsKey("Phase") && StringUtils.equalsIgnoreCase(stageType, "Stage")) { 
       JsonJavaArray mapPhJJA = new JsonJavaArray(); 
       for (String key : mappings.get("Phase")) { 
        Map<String, Object> entryMap = allView.getFirstEntryByKey(key).getColumnValuesMap(); 
        if ("Live".equalsIgnoreCase((String) entryMap.get("status")) || isAdmin()) { 
         mapPhJJA.add(entryMap); 
        } 

       } 
       jjo.put("phase", mapPhJJA); 
      } else { 
       if (!jjo.containsKey("phase")) { 
        jjo.put("phase", ""); 
       } 
      } 
      if (mappings.containsKey("Activity")) { 
       JsonJavaArray actJJA = new JsonJavaArray(); 
       for (String key : mappings.get("Activity")) { 
        try { 
         Map<String, Object> entryMap = allView.getFirstEntryByKey(key).getColumnValuesMap(); 
         if ("Live".equalsIgnoreCase((String) entryMap.get("status")) || isAdmin()) { 
          actJJA.add(entryMap); 
         } 

        } catch (Exception ex) { 
        } 
       } 

       jjo.put("child", "Activities"); 
       jjo.put("activities", actJJA); 
      } else if (mappings.containsKey("Substage") && StringUtils.equalsIgnoreCase(stageType, "Stage")) { 
       JsonJavaArray ssJJA = new JsonJavaArray(); 
       for (String key : mappings.get("Substage")) { 
        Map<String, Object> entryMap = allView.getFirstEntryByKey(key).getColumnValuesMap(); 
        if ("Live".equalsIgnoreCase((String) entryMap.get("status")) || isAdmin()) { 
         ssJJA.add(entryMap); 
        } 
       } 
       jjo.put("child", "Substages"); 
       jjo.put("substages", ssJJA); 
      } 
     } 

     return jjo; 
    } 

    public static JsonJavaObject getPhase(String ukey) { 
     Phases phase = new Phases(); 
     phase.load(ukey); 
     JsonJavaObject jjo = new JsonJavaObject(); 
     if (!isAdmin() && !StringUtil.equalsIgnoreCase((String) phase.getValue("Status"), "Live")) { 
      return null; 
     } 
     jjo.put("title", phase.getValue("Title")); 
     jjo.put("ukey", phase.getUnid()); 
     jjo.put("status", phase.getValue("Status")); 

     jjo.put("overview", phase.getValue("Overview")); 
     jjo.put("order", phase.getValue("SortOrder")); 
     try { 
      jjo.put("artefacts", phase.getArtefacts()); 
     } catch (Exception e) { 
      jjo.put("artefacts", null); 
      e.printStackTrace(); 
     } 
     TreeMap<String, ArrayList<String>> mappings = Mappings.loadMyMap(ukey); 
     if (!mappings.isEmpty() && mappings.containsKey("Stage")) { 
      JsonJavaArray jja = new JsonJavaArray(); 
      for (String key : mappings.get("Stage")) { 
       ViewEntry stage = allView.getFirstEntryByKey(key); 
       if (null != stage) { 
        if (isAdmin() || "Live".equalsIgnoreCase((String) stage.getColumnValue("status"))) { 
         Map<String, Object> stg = stage.getColumnValuesMap(); 
         TreeMap<String, ArrayList<String>> stgMap = Mappings.loadMyMap(key); 
         if (!stgMap.isEmpty() && stgMap.containsKey("Stream")) { 
          JsonJavaArray stgStreamArr = new JsonJavaArray(); 
          for (String stream : stgMap.get("Stream")) { 
           try { 
            Map<String, Object> entryMap = allView.getFirstEntryByKey(stream).getColumnValuesMap(); 
            if ("Live".equalsIgnoreCase((String) entryMap.get("status")) || isAdmin()) { 
             stgStreamArr.add(entryMap); 
            } 

           } catch (Exception ex) { 
           } 
          } 
          stg.put("stream", stgStreamArr); 
         } 
         jja.add(stg); 
        } 
       } 
      } 
      jjo.put("stages", jja); 
     } 
     return jjo; 
    } 

    public static JsonJavaObject getEndUserMap() { 

     setRequestedType("Map"); 
     JsonJavaObject endUserMap = new JsonJavaObject(); 
     try { 

      ArrayList<String> docTypes = new ArrayList<String>(); 
      docTypes.add("Phase"); 
      docTypes.add("Stream"); 
      for (String dtype : docTypes) { 
       View view = db.getView("map" + dtype); 
       JsonJavaArray jja = new JsonJavaArray(); 
       ViewEntryCollection vec; 
       if (isAdmin()) { 
        vec = view.getAllEntries(); 
       } else { 
        vec = view.getAllEntriesByKey("Live"); 
       } 
       for (ViewEntry ve : vec) { 
        jja.add(ve.getColumnValuesMap()); 
       } 
       endUserMap.put(dtype, jja); 

      } 

     } catch (Exception e) { 
      e.printStackTrace(); 

     } 
     return endUserMap; 
    } 

    @SuppressWarnings("unchecked") 
    public static boolean isAdmin() { 

     List<String> roleList = ExtLibUtil.getXspContext().getUser().getRoles(); 
     if (!roleList.isEmpty() && roleList.contains("[admin]")) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 
+0

см., Если это поможет: http://stackoverflow.com/questions/11177842/xpages-get-number-of-active- session-lotus-domino-8-5-2 – Giuseppe

+0

предоставить фрагмент кода в вашем классе EndUserMap, пожалуйста –

+0

Я добавил код EndUserMap.java здесь. Я отключил свою пользовательскую страницу ошибок, и теперь я вижу следующие записи в журнале для этого класса: > HTTP JVM: SEVERE: CLFAD0141E: Ошибка обработки запроса XPage > HTTP JVM: SEVERE: CLFAD0211E: Исключение выбрано > HTTP JVM: SEVERE: CLFAD0246E: произошел сбой при обслуживании: /igdmnext/igdm.nsf/Services.xsp/uiMap - HTTP-код: 500 > HTTP-сервер: исключение из команды исключено [/igdmnext/igdm.nsf/Services.xsp/uiMap?type = map & ukey =] – Arun

ответ

2

Вызванный: java.lang.NullPointerException на org.openntf.domino.xsp.session.AbstractXPageSessionFactory.wrapSession (AbstractXPageSessionFactory.java:23) при org.openntf.domino.xsp.session.XPageSignerSessionFactory.createSession (XPageSignerSessionFactory.java:18) в org.openntf.domino.utils.Factory.getSession (Factory.java:952) в

Это, кажется, поражая ошибка при получении подписавшего сеанса.

Это может быть проблема синхронизации, вызванная тем, что она работает в другом ClassLoader, прежде чем фабрика ODA инициализирует сессии завода. Я не уверен, как это подтвердить, но если ваша ошибка попадает в журналы до регистрации XOTS при запуске сервера, это почти наверняка будет.

В качестве альтернативы, это может быть нецелесообразно, если вы не найдете подписчика. Я обычно использовал Factory.getSession(SessionType.NATIVE) вместо сеанса подписывающего лица. Это выполняется под идентификатором сервера, который должен быть достаточно высоким и избегать проблемы с несколькими подписчиками и т. Д.

+0

Спасибо, Пол. Я понял этот вопрос выше. После получения сеанса session.getCurrentDatabase() имеет значение NULL. Это вызвано различными ClassLoaders? – Arun

+0

ODA использует 'getCurrentDatabase()' довольно немного в плагине org.openntf.domino.xsp', поэтому он должен быть доступен. Трассировка стека ссылается на NSFComponentModule, который, я считаю, является контекстом NSF, в котором он работает. Поэтому он должен иметь текущий контекст базы данных.Трассировка стека также подразумевает, что она происходит при частичном обновлении, что исключает использование другого класса ClassLoader. Вероятно, потребуется отладка, чтобы выработать то, что было инициализировано там, и попробовать запустить Java-код в представлении «Просмотр» («Окно»> «Показать вид»> «Другое»> «Дисплей», если вы не использовали его раньше - он по умолчанию скрыт). –

+0

Нужно ли добавлять исправления для сеанса ODA, например. godmode/khan и т. д. для XSP.properties? Как мне это сделать? Также, только что проверено, SessionType.Current работает просто отлично. – Arun

Смежные вопросы