2012-12-19 14 views
8

Il seguente codice di lavoro dimostra di includere due servlet in un'istanza incorporata di jetty.Molo incorporato con modelli di servlet annotati?

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(); 

Come questo dovrebbe essere modificato in modo che invece di utilizzare l'URL "/ iPhone", che avrebbe utilizzato le urlpatterns nel l'annotazione del servlet, vale a dire

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

risposta

6

Le servlet sono sul server di classpath piuttosto che confezionato in una WAR.

Servlet 3.0 specification stati:

In un'applicazione web, classi utilizzando annotazioni avranno le loro annotazioni trattati solo se si trovano nella directory WEB-INF/classes, o se sono confezionati in un file jar trova in WEB-INF/lib all'interno dell'applicazione.

Il descrittore di distribuzione dell'applicazione Web contiene un nuovo attributo "metadata-complete" metadata-complete "nell'elemento di app Web. L'attributo "metadata-complete" definisce se il descrittore web è completo o se i file di classe del file jar devono essere esaminati per annotazioni e frammenti web al momento della distribuzione. Se "metadata-complete" è impostato su "true", lo strumento di distribuzione DEVE ignorare eventuali annotazioni servlet presenti nei file di classe dell'applicazione e dei frammenti web. Se l'attributo metadata-complete è non specificato o è impostato su "false", lo strumento di distribuzione deve esaminare i file di classe dell'applicazione per le annotazioni ed eseguire la scansione per i frammenti Web .

Potrebbe essere necessario esaminare un pacchetto WAR e utilizzare un contesto con più funzioni come WebAppContext.

In alternativa, è possibile provare la scansione della propria annotazione. Qualcosa del tipo:

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); 
    } 
} 
+0

E se si tratta di una build di debug e IDE posiziona le classi al di fuori di WEB-INF/classi? –

+0

@ RobertVažan È probabile che le annotazioni non vengano scansionate nel tuo caso per i motivi sopra descritti. – McDowell

+0

Il secondo link è morto. – user2418306

0

Si prega di vedere la mia risposta qui: Embedded Jetty does not find Annotated Servlet

In breve, è necessario:

  1. impostare le configurazioni necessarie, come indicato nella risposta
  2. forza Jetty per scansionare la directory classes/dove sono presenti i servlet compilati. Per impostazione predefinita, esegue solo la scansione dei barattoli che penso.
Problemi correlati