Java - Dynamically Adding URL Pattern to a Servlet

java, servlet-3.0, servlets

Solution

I'm not sure I understand your end goal, but here's a possible solution.

With Servlet 3.0, implement the `ServletContainerInitializer` interface. Register it as the javadoc says

Implementations of this interface must be declared by a JAR file resource located inside the `META-INF/services` directory and named for the fully qualified class name of this interface

In its `onStartup(..)` method, you will have access to all the classes on your web application's classpath.

Scan them one by one. If a class is in the package you want and it has the annotation you are looking for, process it and store the URL pattern in a collection.

When the scan is done, you can register `Servlet` instances/classes with the provided `ServletContext` and register URL patterns with the given `ServletRegistration.Dynamic` object.

ServletRegistration.Dynamic registration = servletContext.addServlet("myServlet", new MyServlet());
registration.addMapping(yourCollectionAsAStringArray);

You have many other configuration options as well if you need them.

Problem

Is it possible to add a URL pattern to a Servlet dynamically at runtime? For example, when the Servlet starts up, scan a folder for annotations, and then inject those url patterns into the servlet? - to provide more clarity - In the Servlet's init file, I want to do this (pseudo-code) ``` // scan all the files in the package my.project.services // find all the classes with the Annotation @Service // read those annotations, find the url patterns in them, and insert them into the servlet ```

Original source

Related problems