LoggingFilter is ignored in Jersey and Jetty

I am trying to customize LoggingFilterfor Jersey in Jetty's inline customization. The glue code used is as follows:

ServletContainer servletContainer = new ServletContainer(application);
ServletHolder servletHolder = new ServletHolder(servletContainer);
servletHolder.setInitParameter("com.sun.jersey.config.feature.Debug", "true");
servletHolder.setInitParameter("com.sun.jersey.config.feature.Trace", "true");
servletHolder.setInitParameter("com.sun.jersey.spi.container.ContainerRequestFilters", 
  "com.sun.jersey.api.container.filter.LoggingFilter");
servletHolder.setInitParameter("com.sun.jersey.spi.container.ContainerResponseFilters", 
  "com.sun.jersey.api.container.filter.LoggingFilter");

But the log filter is actually ignored, and I don't see the corresponding logs in the console. How can i do this? Tested on both Jersey 1.x and 2.x.

A corresponding answer describes how to achieve this using web.xml.

+5
source share
2 answers

I think this is a very subtle nuance of documented behavior ServletContainer, if it is not a direct mistake. ServletContainerdocs regarding initialization parameters read as:

ResourceConfig.

. , ResourceConfig ServletContainer, , , . Application, new ServletContainer(application), :

ServletContainer Application:

public ServletContainer(Application app) {
    this.app = app;
}

ServletContainer Servlet:

protected void init(WebConfig webConfig) throws ServletException {
    webComponent = (app == null)
            ? new InternalWebComponent()
            : new InternalWebComponent(app);
    webComponent.init(webConfig);
}

Application InternalWebComponent. InternalWebComponent - WebComponent, :

InternalWebComponent(Application app) {
    super(app);
}

:

public WebComponent(Application app) {
    if (app == null)
        throw new IllegalArgumentException();

    if (app instanceof ResourceConfig) {
        resourceConfig = (ResourceConfig) app;
    } else {
        resourceConfig = new ApplicationAdapter(app);
    }
}

, Application , if ResourceConfig. WebComponent.init() (. ServletContainer.init() , ). init() " ResourceConfig", , , , , . I.e., ResourceConfig , :

public void init(WebConfig webConfig) throws ServletException {
    ...
    if (resourceConfig == null)
        resourceConfig = createResourceConfig(config);
    ...
}

createResourceConfig() ( WebComponent) :

private ResourceConfig createResourceConfig(WebConfig webConfig)
        throws ServletException {
    final Map<String, Object> props = getInitParams(webConfig);
    final ResourceConfig rc = createResourceConfig(webConfig, props);
    rc.setPropertiesAndFeatures(props);
    return rc;
}

, setPropertiesAndFeatures() ResourceConfig. , , , , - ServletContainer .

, ServletContainer no-arg , Servlet 3.0, , . .

, : ServletContainer :

Map<String, Object> props = getInitParams(webConfig);
rc.setPropertiesAndFeatures(props);

, , . , Application init, , :

servletHolder.setInitParameter("javax.ws.rs.Application", "org.foo.MyApplication");

, "" , WebComponent ResourceConfig init .

+4

, .

// Creating an instance of Jersey servlet, right?
ServletContainer servletContainer = new ServletContainer(application);

// Putting it in a container by reference.
ServletHolder servletHolder = new ServletHolder(servletContainer);

, :

ServletHolder sh = new ServletHolder(WicketServlet.class);

Jetty servlet init(). init(), , ServletConfiguration.

UPDATE: :

  ServletHolder servletHolder = new ServletHolder(ServletContainer.class);
  servletHolder.setInitParameter("javax.ws.rs.Application", "MyRESTApplication");
  servletHolder.setInitParameter("com.sun.jersey.config.feature.Debug", "true");
  servletHolder.setInitParameter("com.sun.jersey.config.feature.Trace", "true");
  servletHolder.setInitParameter("com.sun.jersey.spi.container.ContainerRequestFilters",
      "com.sun.jersey.api.container.filter.LoggingFilter");
  servletHolder.setInitParameter("com.sun.jersey.spi.container.ContainerResponseFilters",
      "com.sun.jersey.api.container.filter.LoggingFilter");

  ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
  contextHandler.addServlet(servletHolder, "/services/*");
  server.setHandler(contextHandler);
0

All Articles