Servlet 3.0 support in embedded Jetty 8.0

For my unit tests, I use a simple Jetty-based test server:

package eu.kostia.textanalysis.webservices.jetty; import java.awt.Desktop; import java.net.URI; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; public class TestServer { static private final String CONTEXT_PATH = "/webservice"; static private final String PROJECT_HOME = System.getenv("MY_WORKSPACE_HOME") + "/WebServices"; static public final int PORT = 8080; private Server server; private Exception startException; private static class SingletonHolder { private static final TestServer INSTANCE = new TestServer(); } /** * Returns the singleton instance of the test server. * * @return the singleton instance of the test server. */ public static TestServer getInstance() { return SingletonHolder.INSTANCE; } private TestServer() { server = new Server(PORT); WebAppContext context = new WebAppContext(); context.setDescriptor(PROJECT_HOME + "/web/WEB-INF/web.xml"); context.setResourceBase(PROJECT_HOME + "/web"); context.setContextPath(CONTEXT_PATH); context.setParentLoaderPriority(true); server.setHandler(context); } /** * Start the test server. This method returns only when the server is * complete started. There is no effect when you invoke this method and the * server is already running. */ public void start() { if (!server.isRunning()) { startException = null; new Thread("TestServer") { public void run() { try { server.start(); server.join(); } catch (Exception exc) { startException = exc; } } }.start(); while (true) { if (startException != null) { throw new Error(startException); } // Block this method call until the server is started if (server.isStarted()) { return; } } } } /** * Stop the test server. */ public void stop() { try { if (server.isRunning()) { server.stop(); } } catch (Exception e) { throw new Error(e); } } /** * Returns {@code true} is the server is running. * * @return {@code true} is the server is running. */ public boolean isRunning() { return server.isRunning(); } public static void main(String[] args) throws Exception { TestServer.getInstance().start(); Desktop.getDesktop().browse(new URI("http://localhost:8080/webservice/")); } } 

It works fine for the servlet configured in web.xml, but now I would like to use the new annotation syntax introduced using the servlet 3.0 specification, for example:

 @WebServlet(urlPatterns = {"/hello"}) public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getWriter(); writer.print("<h1>HttpServlet using Servlet 3.0</h1>"); } } 

How do I configure Jetty in my TestServer class to handle annotation-based servlets?

+6
servlets embedded-jetty
source share
3 answers

Add to your code

 context.setConfigurations(new Configuration[] { new AnnotationConfiguration(), new WebXmlConfiguration(), new WebInfConfiguration(), new TagLibConfiguration(), new PlusConfiguration(), new MetaInfConfiguration(), new FragmentConfiguration(), new EnvConfiguration() }); 

You only need to set AnnotationConfiguration to get automatic detection of annotated classes. The rest of the configurations are for you to enable other aspects of the container. Presumably, you should be able to do this from the command line using OPTIONS = annotations, jsp, (etc.), but I never got this working. At least in this way, it should pick your annotated classes correctly in the embedded environment.

Just as a side note, it seems that the Eclipse jetty design by default is canceled, while riptide claims to be enabled by default. I assume this is the difference in the configuration files.

+8
source share

The answer is another year later.

In the current version of Jetty (8.1), you can do exactly what you want with the command line:

 java -jar start.jar OPTIONS=annotations,plus etc/jetty-plus.xml 

called from the home directory of the berth.

+1
source share

Jetty 8 implements the servlet 3.0 specification, but it is still experimental.

You can also use the built-in Glassfish 3 plugin to run your tests. See the links below for some details: http://wikis.sun.com/display/GlassFish/3.1EmbeddedOnePager http://ocpsoft.com/java/using-embedded-glassfish-with-maven/ http: // embedded- glassfish.java.net/

I understand, as I write this, that there is no authoritative resource for using the Glassfish plugin in the way that Jetty is often used. However, it works in a similar way.

Hope this helps at least a little.

0
source share

All Articles