嵌入式Jetty带有带注释的servlet模式?

Jac*_*cob 8 java jetty embedded-jetty servlet-3.0

以下工作代码演示了将两个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();
Run Code Online (Sandbox Code Playgroud)

应如何改变,以便不使用url"/ iphone",而是使用servlet注释中的urlpatterns,即

@WebServlet(urlPatterns={"/json", "/iphone"})
public class Iphone extends HttpServlet {
    ....
}
Run Code Online (Sandbox Code Playgroud)

McD*_*ell 7

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

Servlet 3.0规范声明:

在Web应用程序中,使用注释的类只有在它们位于WEB-INF/classes目录中时才会处理注释 ,或者如果它们打包在位于WEB-INF/lib应用程序内的jar文件中.

Web应用程序部署描述符metadata-complete在web-app元素上包含新的" "属性." metadata-complete"属性定义Web描述符是否完整,或者是否应在部署时检查jar文件的类文件是否有注释和Web片段.如果" metadata-complete"设置为" true",则部署工具必须忽略应用程序和Web片段的类文件中存在的任何servlet注释.如果未指定metadata-complete属性或将其设置为"false",则部署工具必须检查应用程序的类文件以进行注释,并扫描Web片段.

您可能需要查看打包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);
    }
}
Run Code Online (Sandbox Code Playgroud)