【问题标题】:Embedded Jetty with annotated servlet patterns?带有注释的 servlet 模式的嵌入式 Jetty?
【发布时间】:2012-12-06 19:42:59
【问题描述】:

以下工作代码演示了将两个 servlet 包含到 jetty 的嵌入式实例中。

Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
context.addServlet(new ServletHolder(new Html()), "/html");
context.addServlet(new ServletHolder(new Iphone()), "/iphone");       
server.setHandler(context);
server.start();
server.join();

这应该如何改变,而不是使用url“/iphone”,而是使用servlet注释中的urlpatterns,即

@WebServlet(urlPatterns={"/json", "/iphone"})
public class Iphone extends HttpServlet {
    ....
}

【问题讨论】:

    标签: java jetty embedded-jetty servlet-3.0


    【解决方案1】:

    servlet 位于服务器的类路径中,而不是打包在 WAR 中。

    Servlet 3.0 specification 状态:

    在 Web 应用程序中,使用注解的类将拥有自己的 只有当它们位于 WEB-INF/classes 目录,或者如果它们被打包在一个 jar 文件中 位于应用程序内的WEB-INF/lib

    Web 应用程序部署描述符包含一个新的 web-app 元素上的“metadata-complete”属性。这 “metadata-complete”属性定义网络描述符是否为 完成,或者jar文件的class文件是否应该 在部署时检查注释和 Web 片段。如果 “metadata-complete”设置为“true”,部署工具必须 忽略存在于类文件中的任何 servlet 注释 应用程序和 Web 片段。如果 metadata-complete 属性是 未指定或设置为“false”,部署工具必须检查 应用程序的类文件进行注释,并扫描网页 碎片。

    您可能需要考虑打包 WAR 并使用具有更多功能的上下文,例如 WebAppContext

    或者,您可以尝试自己的注释扫描。某种形式的东西:

    void registerServlets(ServletContextHandler context,
                                  Class<? extends HttpServlet> type)
              throws InstantiationException, IllegalAccessException,
                     InvocationTargetException, NoSuchMethodException {
        WebServlet info = type.getAnnotation(WebServlet.class);
        for (String pattern : info.urlPatterns()) {
            HttpServlet servlet = type.getConstructor().newInstance();
            context.addServlet(new ServletHolder(servlet), pattern);
        }
    }
    

    【讨论】:

    • 如果是调试版本并且 IDE 将类放在 WEB-INF/类之外怎么办?
    • @RobertVažan 由于上述原因,您的情况可能不会扫描注释。
    • 第二个链接失效了。
    • 注释扫描器是一个非常有趣的概念,但它对我不起作用。注释已处理,但无法提供服务。
    【解决方案2】:

    请在此处查看我的答案:Embedded Jetty does not find Annotated Servlet

    简而言之,您需要:

    1. 按照答案中的说明设置必要的配置
    2. 强制 Jetty 扫描已编译的 servlet 所在的 classes/ 目录。默认情况下,它只扫描我认为的罐子。

    【讨论】:

      猜你喜欢
      • 2015-02-25
      • 2015-10-16
      • 1970-01-01
      • 2015-06-24
      • 2011-06-27
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多