2

为了拥有自定义会话存储,我实现了自定义 sessionManager(通过扩展NoSqlSessionManager)和 sessionIdManager。我的代码(连同它需要的 jars)进入${jetty.home}/lib/ext(版本 8.1.4 BTW)。我包含了另一个具有start.ini以下内容的配置文件:

<Configure id="Server" class="org.eclipse.jetty.server.Server">
    <Set name="sessionIdManager">
        <New id="customIdMgr" class="com.me.customSessionIdManager">
            <Arg>...</Arg>
        </New>
    </Set>
</Configure>

码头启动并且 sessionIdManager 似乎正在工作。至少scavenge()方法被调用。到现在为止还挺好。下一步是将我的自定义 sessionManager 与WebAppContext我选择的相关联。我在覆盖模板 ( overlay.xml) 中使用以下内容进行了操作:

<Configure class="org.eclipse.jetty.webapp.WebAppContext">

  <Get name="server">
    <Get id="customIdMgr" name="sessionIdManager"/>
  </Get>


  <Set name="sessionHandler">
    <New class="org.eclipse.jetty.server.session.SessionHandler">
      <Arg>
        <New class="com.me.customSessionManager">
          <Set name="sessionIdManager"><Ref id="customIdMgr"/></Set>
        </New>
      </Arg>
    </New>
  </Set>

</Configure>

但是,当启动 Jetty 时,我得到了这个:

WARN:oejx.XmlConfiguration:Config error at <Get id="customIdMgr" name="sessionIdManager"/> java.lang.NullPointerException

...这意味着在处理覆盖时,在主码头配置中注册的对象现在消失了。

知道我在这里做错了什么吗?

4

1 回答 1

2

经过大量调试后发现,问题的根源是<Get name="server">返回 null。很可能对 Server 类的引用在部署过程的后期注入到 WebAppContext 中。因此,我没有得到服务器,而是引用了它,<Ref id="Server">这就是诀窍。

于 2012-08-24T16:30:47.573 回答