【问题标题】:Servlet with Guice and Jetty Embedded嵌入 Guice 和 Jetty 的 Servlet
【发布时间】:2021-04-03 17:44:53
【问题描述】:

我正在尝试使用带有 Jetty 的 Guice Servlet 在 servlet 中注入一些对象。

我以这种方式创建了 servlet:

injector = injector.createChildInjector( new ServletModule() 
        {
            @Override
            protected void configureServlets() {
            serve("/jsonServlet").with(JsonServlet.class);
            }
        }
    );

logger.info("Start Hermes server");
JettyServer jettyServer = injector.getInstance(JettyServer.class);
jettyServer.start();

Jetty服务器是这样启动的:

QueuedThreadPool threadPool = new QueuedThreadPool(MAX_THREADS, MIN_THREADS, IDLE_TIMEOUT);
Server server = new Server(threadPool);
try (ServerConnector connector = new ServerConnector(server)) {
    connector.setPort(serverBindPort);
    connector.setHost(serverBindAddress.getHostAddress());
    server.setConnectors(new Connector[] { connector });

    ServletHandler servletHandler = new ServletHandler();
    servletHandler.addFilterWithMapping(com.google.inject.servlet.GuiceFilter.class, "/*", 1);
    
    server.setHandler(servletHandler);

    server.start();
    server.join();
}

jsonServlet 就是这个:

public JsonServlet(){
    logger.info("Called no arguments constructor");
}

@Inject
public JsonServlet(@DatabaseUri String databaseUri,
                    @DatabaseUserName String databaseUserName,
                    @DatabasePassword String databasePassword){
    logger.info("Called Guice constructor");
    this.databaseUri = databaseUri;
    this.databaseUserName = databaseUserName;
    this.databasePassword = databasePassword;
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 
    logger.info("I am inside the doPost");
    logger.info("Data base Uri is = {}", databaseUri);
}

App 启动和码头等待第一个帖子,不幸的是,一旦帖子到达,就会触发 Null 指针异常:

[INFO ] 23:31:01.670 it.fox.hermes.servlets.JsonServlet.<init>() - Called Guice constructor
[INFO ] 23:31:01.671 it.fox.hermes.servlets.JsonServlet.init() - Init Receive Json servlet
[INFO ] 23:31:01.701 org.eclipse.jetty.server.AbstractConnector.doStart() - Started ServerConnector@3c989952{HTTP/1.1, (http/1.1)}{0.0.0.0:8090}
[INFO ] 23:31:01.701 org.eclipse.jetty.server.Server.doStart() - Started @1026ms
[WARN ] 23:31:09.044 org.eclipse.jetty.server.HttpChannel.handleException() - /receiveJson
java.lang.NullPointerException: null
        at com.google.inject.servlet.ServletUtils.getContextRelativePath(ServletUtils.java:57) ~[guice-servlet-4.2.3.jar:?]
        at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178) ~[guice-servlet-4.2.3.jar:?]
        at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:89) ~[guice-servlet-4.2.3.jar:?]
        at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:121) ~[guice-servlet-4.2.3.jar:?]
        at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:133) ~[guice-servlet-4.2.3.jar:?]
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1638) ~[jetty-servlet-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:567) ~[jetty-servlet-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:190) ~[jetty-server-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:507) ~[jetty-servlet-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[jetty-server-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[jetty-server-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.server.Server.handle(Server.java:501) ~[jetty-server-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383) ~[jetty-server-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:556) ~[jetty-server-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375) [jetty-server-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:273) [jetty-server-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [jetty-io-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) [jetty-io-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) [jetty-io-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) [jetty-util-9.4.31.v20200723.jar:9.4.31.v20200723]
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) [jetty-util-9.4.31.v20200723.jar:9.4.31.v20200723]
        at java.lang.Thread.run(Thread.java:830) [?:?]

我不明白这个空指针是从哪里来的,错误在哪里。

谢谢, 斯特凡诺

【问题讨论】:

    标签: servlets guice servlet-filters embedded-jetty


    【解决方案1】:

    Guice 要求的过滤器的使用可能有问题。

    这是我找到的解决问题的方法:

    QueuedThreadPool threadPool = new QueuedThreadPool(MAX_THREADS, MIN_THREADS, IDLE_TIMEOUT);
    
    server = new Server(threadPool);
    try (ServerConnector connector = new ServerConnector(server)) {
        connector.setPort(serverBindPort);
        connector.setHost(serverBindAddress.getHostAddress());
        server.setConnectors(new Connector[] { connector });
        // Guice Injection in servlets
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        ServletHandler handler = new ServletHandler();
        FilterHolder fh = handler.addFilterWithMapping(com.google.inject.servlet.GuiceFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
        context.addFilter(fh, "/*", EnumSet.of(DispatcherType.REQUEST));
        server.setHandler(context);
    
        server.start();
        server.join();
    
    }
    

    以这种方式注入带有jetty嵌入式工作的servlet。

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 2015-06-24
      • 2015-03-23
      • 2013-06-19
      • 2015-02-25
      • 2015-10-16
      • 1970-01-01
      • 2011-06-29
      • 2013-07-09
      相关资源
      最近更新 更多