2017-06-06 69 views
1

我有我的JAX-RS网络服务与灰熊服务器运行,但我不能配置我的@WebListener工作。我正在构建一个框架,因此我无法切换到灰熊听众。泽西灰熊容器瓦特/ @WebListener ServletContextListeners

我有最新的图书馆。

<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) 

回答

0

IllegalStateException异常:资源配置是不是在这种情况下修改

它,除非布尔标志传递给重载的方法,因为createHttpServer(uri, resourceConfig)自动启动服务器,告诉它到自动启动。

另一件事是你正在试图创建两个应用程序。一旦您拨打createHttpServer通过ResourceConfig,而另一次当您创建ServletContainerResourceConfig相同。

你应该做的只是超载createHttpServer(uri)。这不会创建应用程序,并且不会启动服务器。当您创建ServletContainerResourceConfig并将其传递到WebAppContext时,您创建泽西岛应用程序。

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; 
}