【问题标题】:Problems with DefaultServletDefaultServlet 的问题
【发布时间】:2019-08-21 21:03:58
【问题描述】:

我在我的应用程序中嵌入了码头服务器,并使用 WebAppContext 返回静态文件(.html、.png 等)并存储 servlet。当我尝试从浏览器获取静态时,我收到由异常引起的 503 错误,但 servlet 工作正常。正如我从堆栈跟踪中了解到的那样,WebAppContext 尝试使用 DefaultServlet 返回静态文件。我尝试将 DefaultServlet 设置为“/*”路径,但仍然出现该异常。是否有其他方法可以在没有 DefaultServlet 的情况下通过 WebAppContext 返回静态文件?

我尝试使用 ResourceHandler 而不是 WebAppContext,它工作正常,但忽略了码头登录约束(也尝试使用 WebAppContext 和没有约束打开并得到相同的错误)

例外:

2019-03-31 18:14:28.344:WARN:oejs.ServletHandler:qtp129498568-21: Error for /reg.html
java.lang.NoSuchMethodError: org.eclipse.jetty.http.HttpContent.getContentLength()J
    at org.eclipse.jetty.servlet.DefaultServlet.sendData(DefaultServlet.java:865)
    at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:531)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:781)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:553)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1126)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1060)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:113)
    at org.eclipse.jetty.server.Server.handle(Server.java:509)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:288)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:240)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:539)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:620)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:540)
    at java.base/java.lang.Thread.run(Thread.java:834)

代码:

    Server server = new Server(8080);

    String htmlResourcesPath = "web";

    WebAppContext webAppContext = new WebAppContext();
    webAppContext.setContextPath("/");
    webAppContext.setResourceBase(htmlResourcesPath);
    webAppContext.setParentLoaderPriority(true);

    webAppContext.addServlet(RedirectServlet.class, "");
    webAppContext.addServlet(RegisterServlet.class, "/reg");
    webAppContext.addServlet(AuthServlet.class, "/auth");

    server.setHandler(webAppContext);

【问题讨论】:

  • 您得到的错误意味着您正在使用几个彼此不兼容的码头罐子:org.eclipse.jetty.servlet.DefaultServlet 类尝试调用一个方法 getContentLength() '在类 org.eclipse.jetty.http.HttpContent 中不存在。你需要修复你的依赖关系。
  • 我只使用嵌入式码头库和 maven jetty 插件。它们会相互冲突吗?

标签: java servlets jetty


【解决方案1】:

java.lang.NoSuchMethodError: org.eclipse.jetty.http.HttpContent.getContentLength()J

您的 Jetty JAR 文件版本不匹配。

确保您的项目中只有一个版本的所有 Jetty JAR 文件。

如果您使用的是embedded-jetty,那么您将不会使用jetty-maven-plugin,因此请选择其中一个,但不要同时使用。

【讨论】:

    【解决方案2】:

    感谢大家的帮助。只是指定:

    我使用了 2 个码头版本:

    <!--dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>9.3.0.M1</version>
    </dependency-->
    
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-webapp</artifactId>
        <version>9.3.0.M0</version>
    </dependency>
    

    我认为 jetty-webapp 是对 jetty-server 的补充,但它们是相互冲突的独立库

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 1970-01-01
      • 2015-11-27
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      相关资源
      最近更新 更多