【问题标题】:Jersey Grizzly Containers w/ @WebListener ServletContextListeners带有 @WebListener ServletContextListeners 的 Jersey Grizzly 容器
【发布时间】:2017-06-06 23:34:11
【问题描述】:

我的 JAX-RS Web 服务与 grizzly-server 一起运行,但我无法配置我的 @WebListener 工作。我正在构建一个框架,因此我无法切换到 Grizzly 侦听器。

我有最新的库。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-grizzly2-http</artifactId>
</dependency>
<dependency>
    <groupId>org.glassfish.grizzly</groupId>
    <artifactId>grizzly-http-servlet</artifactId>
    <version>2.3.30</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
</dependency>

这是一些代码:

@ApplicationPath("/SampleAdmin")
public class SampleAdminApplication extends ResourceConfig {
    public SampleAdminApplication() {
        packages("com.companyname.sample.sampleadmin.server.services");
    }
}

    @WebListener
    public class SampleAdminListener implements ServletContextListener {
        private static final Logger log = Logger.getLogger(SampleAdminListener.class);

        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            log.info("SampleAdminListener Initializing context.");
        }

        @Override
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
            log.info("SampleAdminListener Destroying context.");
        }
    }
    /**
     * Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
     * @return Grizzly HTTP server.
     */
    public static HttpServer startServer() {
        // create a resource config that scans for JAX-RS resources and providers
        // in com.example.rest package
        final ResourceConfig rc = new SampleAdminApplication();

        // create and start a new instance of grizzly http server
        // exposing the Jersey application at BASE_URI
        HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);

        WebappContext context = new WebappContext("WebappContext", "/" + webapp);
        context.addListener("com.vilabs.sample.sampleadmin.server.servlet.SampleAdminListener");
        context.addFilter("SampleAdminFilter", SampleAdminFilter.class);
        context.addFilter("SampleAdminCsrfFilter", SampleAdminCsrfFilter.class);
//        ServletRegistration registration = context.addServlet("ServletContainer", new ServletContainer(rc));
        ServletRegistration registration = context.addServlet("ServletContainer", new ServletContainer(rc));
        registration.addMapping("/*");

        context.deploy(httpServer);
        return httpServer;
    }

对 context.deploy(httpServer) 的调用会引发 IllegalStateException。

Jun 06, 2017 7:14:14 PM org.glassfish.grizzly.servlet.WebappContext deploy
SEVERE: [WebappContext] Exception deploying application.  See stack trace for details.
java.lang.RuntimeException: java.lang.IllegalStateException: The resource configuration is not modifiable in this context.
    at org.glassfish.grizzly.servlet.WebappContext.initServlets(WebappContext.java:1833)
    at org.glassfish.grizzly.servlet.WebappContext.deploy(WebappContext.java:318)
    at com.vilabs.sample.sampleadmin.server.SampleServer.startServer(SampleServer.java:60)
    at com.vilabs.sample.sampleadmin.server.SampleServer.main(SampleServer.java:70)
Caused by: java.lang.IllegalStateException: The resource configuration is not modifiable in this context.
    at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:274)
    at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:221)
    at org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:453)
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:387)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369)
    at javax.servlet.GenericServlet.init(GenericServlet.java:244)
    at org.glassfish.grizzly.servlet.WebappContext.initServlets(WebappContext.java:1831)

【问题讨论】:

    标签: jax-rs jersey-2.0 grizzly servletcontextlistener


    【解决方案1】:

    谢谢,过滤器和监听器正在工作

    /**
     * Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
     * @return Grizzly HTTP server.
     */
    public static HttpServer startServer() {
        // create a resource config that scans for JAX-RS resources and providers
        // in com.example.rest package
        final ResourceConfig rc = new SampleAdminApplication();
    
    // create and start a new instance of grizzly http server
    // exposing the Jersey application at BASE_URI
    HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI));
    
    WebappContext context = new WebappContext("WebappContext", "/" + webapp);
    context.addListener("com.vilabs.sample.sampleadmin.server.servlet.SampleAdminListener");
    context.addFilter("SampleAdminFilter", SampleAdminFilter.class);
    context.addFilter("SampleAdminCsrfFilter", SampleAdminCsrfFilter.class);
    ServletRegistration registration = context.addServlet("ServletContainer", new ServletContainer(rc));
    registration.addMapping("/*");
    
    context.deploy(httpServer);
    return httpServer;
    }
    

    【讨论】:

      【解决方案2】:

      IllegalStateException:资源配置在此上下文中不可修改

      这是因为createHttpServer(uri, resourceConfig) 会自动启动服务器,除非将布尔标志传递给重载方法,告诉它不要自动启动。

      另一件事是您正在尝试创建两个应用程序。一次当你调用createHttpServer 传递ResourceConfig,另一次当你创建ServletContainer 时使用相同的ResourceConfig

      你应该做的只是重载的createHttpServer(uri)。这不会创建应用程序,也不会启动服务器。当您使用 ResourceConfig 创建 ServletContainer 并将其传递给 WebAppContext 时,您将创建 Jersey 应用程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-14
        • 2016-06-03
        • 2013-11-15
        • 2014-02-01
        • 2015-09-03
        • 2023-04-07
        • 2013-09-09
        • 2018-01-28
        相关资源
        最近更新 更多