2012-12-19 11 views
8

Poniższy działający kod demonstruje włączenie dwóch serwletów do osadzonej instancji pomostu.Embedded Jetty z adnotacjami wzorców serwletów?

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

Jak to powinno zostać zmienione tak, że zamiast korzystać z URL „/ iPhone”, byłoby użyć urlpatterns w adnotacji serwletu, czyli

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

Odpowiedz

6

W serwlety są na swojego serwera classpath zamiast pakowane w WAR.

Servlet 3.0 specification stany:

w aplikacji internetowej, ćwiczenia z wykorzystaniem adnotacji będą mieli adnotacje przetwarzane tylko wtedy, gdy znajdują się one w katalogu WEB-INF/classes, lub jeśli są one pakowane w pliku jar znajduje się w WEB-INF/lib w aplikacji.

Deskryptor wdrażania aplikacji WWW zawiera nowy atrybut "metadata-complete" w elemencie aplikacji internetowej. Atrybut "metadata-complete" określa, czy deskryptor WWW jest kompletny, czy pliki klas pliku jar powinny być sprawdzane pod kątem adnotacji i fragmentów stron internetowych w czasie wdrażania. Jeśli "metadata-complete" jest ustawione na "true", narzędzie do wdrażania MUSI ignoruje wszelkie adnotacje serwletów obecne w plikach klas aplikacji i fragmentów stron z klasy . Jeśli atrybut metadanych-kompletnych nie jest określony lub jest ustawiony na "fałsz", narzędzie do wdrażania musi sprawdzić pliki klas aplikacji do adnotacji i zeskanować fragmenty WWW .

Być może trzeba będzie spojrzeć na opakowanie WAR i korzystając z kontekstu z większą liczbą funkcji, takich jak WebAppContext.

Możesz również spróbować swoich własnych skanowań adnotacji. Coś o postaci:

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

Co jeśli jest to kompilacja debugowania, a IDE umieszcza klasy poza WEB-INF/classes? –

+0

@ RobertVažan Jest prawdopodobne, że adnotacje nie będą skanowane w twoim przypadku z powodów opisanych powyżej. – McDowell

+0

Drugi link nie działa. – user2418306

0

proszę zobaczyć moją odpowiedź tutaj: Embedded Jetty does not find Annotated Servlet

Krótko mówiąc, trzeba:

  1. ustaw odpowiednie konfiguracje jak stwierdzono w odpowiedzi
  2. siła Jetty skanować klasy/katalog, w którym działają skompilowane serwlety. Domyślnie skanuje tylko słoiki, które myślę.