maven - Jetty 清理 session 错误与 View 范围的 bean

标签 maven jsf heroku jetty cdi

我正在尝试将 Tomcat 应用程序移植到 JettyRunner 9.2 我想将我的应用程序移动到 Heroku,因此我需要使用嵌入式服务器或 JettyRunner 启动它。我认为 JettyRunner 是最简单的,因为我可以保留 WAR 格式,并且在必要时可以轻松移植。

任何帮助将不胜感激。如果我不能很快让它工作,我可能会尝试嵌入式 Tomcat,或者考虑不需要我更改容器的托管。

如果使用 Jetty 的不同方法 - 也许嵌入式 Jetty 会更容易,请告诉我并指出一些细节。

所以,对于应用程序的行为。该应用程序似乎移植得很好并且启动正常,但我在登录时收到错误。这是异常(exception)情况

2014-12-26 05:18:21.189:WARN:oejs.session:org.eclipse.jetty.server.session.HashSessionManager@69f63d95Timer: Problem scavenging sessions
java.lang.NullPointerException
    at com.sun.faces.application.view.ViewScopeContextManager.destroyBeans(Unknown Source)
    at com.sun.faces.application.view.ViewScopeContextManager.sessionDestroyed(Unknown Source)
    at com.sun.faces.application.view.ViewScopeManager.sessionDestroyed(Unknown Source)
    at com.sun.faces.application.WebappLifecycleListener.sessionDestroyed(Unknown Source)
    at com.sun.faces.config.ConfigureListener.sessionDestroyed(Unknown Source)
    at org.eclipse.jetty.server.session.AbstractSessionManager.removeSession(AbstractSessionManager.java:772)
    at org.eclipse.jetty.server.session.AbstractSession.timeout(AbstractSession.java:302)
    at org.eclipse.jetty.server.session.HashSessionManager.scavenge(HashSessionManager.java:358)
    at org.eclipse.jetty.server.session.HashSessionManager$Scavenger.run(HashSessionManager.java:84)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

这是我的 jetty 和 jsf 依赖项:

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>9.2.6.v20141205</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlet</artifactId>
        <version>9.2.6.v20141205</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.faces</artifactId>
        <version>2.2.9</version>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>

这是我的 pom 的 Maven jetty 插件部分:

        <plugin>
          <groupId>org.eclipse.jetty</groupId>
          <artifactId>jetty-maven-plugin</artifactId>
          <version>${org.eclipse.jetty.version}</version>
            <configuration>
                <webApp>
                    <overrideDescriptor>src/main/webapp/WEB-INF/jetty-web-override.xml</overrideDescriptor>
                </webApp>
                <contextXml>src/main/webapp/WEB-INF/jetty-context.xml</contextXml>
            </configuration>
        </plugin>

我的 web.xml 中的监听器

<listener>
    <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

jetty-web-override.xml

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<listener>
    <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>

<resource-env-ref>
    <resource-env-ref-name>BeanManager</resource-env-ref-name>
    <resource-env-ref-type>
        javax.enterprise.inject.spi.BeanManager
    </resource-env-ref-type>
</resource-env-ref>

jetty-env.xml

    <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure id="webAppCtx" class="org.eclipse.jetty.webapp.WebAppContext">
    <New id="BeanManager" class="org.eclipse.jetty.plus.jndi.Resource">

    <Arg>
        <Ref id="webAppCtx"/>
    </Arg>
    <Arg>BeanManager</Arg>
    <Arg>
        <New class="javax.naming.Reference">
            <Arg>javax.enterprise.inject.spi.BeanManager</Arg>
            <Arg>org.jboss.weld.resources.ManagerObjectFactory</Arg>
            <Arg/>
        </New>
    </Arg>
</New>
</Configure>

最后,jetty.context:

<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" 

"http://www.eclipse.org/jetty/configure.dtd">

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

<Set name="serverClasses">
    <Array type="java.lang.String">
        <Item>-org.eclipse.jetty.servlet.ServletContextHandler.Decorator</Item>
    </Array>
</Set>
</Configure>

最佳答案

此问题是由 JSF 实现中与 ViewScoped beans 有关的错误引起的,描述为 here所描述的错误存在于 JSF 2.29 和 2.28 中。该修复已在 2.30 中进行,但尚未发布。

我尝试返回 2.2 层次结构中的版本。 2.27 及之前此错误消失,但 ViewScoped beans 中出现其他错误。

看起来 View Scoped beans 在 jsf 2.2 中基本上被破坏了(据我所知),因此作为临时措施,我已将所有 View Scoped beans 更改为 Request Scoped。这可以避免错误。

关于maven - Jetty 清理 session 错误与 View 范围的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27655790/

相关文章:

java - 类路径中如何定义lib的版本?

java - 如何根据方法调用(返回 boolean 值)渲染或隐藏 jsf subview ?

javascript - 谷歌分析实验导致格式正确的字符数据或标记错误

javascript - 您可以绑定(bind) .click() 以便它在 onclick 之前触发吗?

ruby-on-rails - 从 Heroku 下载我的 Heroku 站点的源代码?

java - Lombok 的 Maven 范围(编译与提供)

java - Maven Jar 中的静态 Web 资源?

Maven 故障安全插件不运行 testNG XML 套件

python - 在 MacOS 上安装 Django-tool belt 的错误消息

python - 无法在 Mac OS X 10.7 上的 virtualenv 中使用 pip 安装 psycopg2