2014-09-04 5 views
2

Short: У меня есть проект, который обеспечивает артефакт войны, который включает сервлет с аннотациями, но не web.xml. Если я пытаюсь использовать войну в причале, я всегда получаю только список каталогов военного контента, но не выполнение сервлета.Встраиваемый Jetty не найден Аннотированный сервлет

Любая идея?

Длинная история: Мои сервлеты выглядеть следующим образом

package swa; 

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@WebServlet(asyncSupported = false, urlPatterns={"/*"}) 
public class ServletX extends HttpServlet { 

    private static final long serialVersionUID = 1L; 

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     // Set response content type 
     response.setContentType("text/html"); 

     // Actual logic goes here. 
     PrintWriter out = response.getWriter(); 
     out.println("<h1>Hi there..</h1>"); 
    } 

} 

Так ничего особенного я думаю. Когда я использую mvn jetty:run, все в порядке. После обеспечения этого проект упакован в военный архив.

Этот военный архив используется в рамках другого проекта, который должен установить причал в коде. Вот как это делается:

 String jettyPort = properties.getProperty("jetty.port", "8080"); 
     Server server = new Server(); 

     ServerConnector httpConnector = new ServerConnector(server, new HttpConnectionFactory()); 
     httpConnector.setPort(Integer.parseInt(jettyPort)); 
     httpConnector.setAcceptQueueSize(2); 
     httpConnector.setHost("0.0.0.0"); 
     httpConnector.setIdleTimeout(30000); 
     server.setConnectors(new Connector[] { httpConnector }); 

     WebAppContext wacHandler = new WebAppContext(); 
     wacHandler.setContextPath("/admin"); 
     wacHandler.setWar("swa-0.0.1-SNAPSHOT.war"); 
     wacHandler.setConfigurationDiscovered(true); 

     server.setHandler(wacHandler); 

     server.start(); 

При выполнении этого проекта журналы сообщают мне, что война найдена. Но если я открою url http://localhost:8080/admin, я вижу только содержимое военного контента (вместо «Привет там»).

Может ли кто-нибудь указать мне на мой отказ?

ответ

4

Необходимо правильно определить конфигурации WebAppContext (и в правильном порядке).

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

Не забудьте добавить jetty-annotations.jar.

Это из EmbedMe.java примера для использования с Servlet 3.1 найти по адресу

https://github.com/jetty-project/embedded-servlet-3.1/

+0

Можно ли это сделать через jetty xml? –

+1

@JoseMartinez Вопрос был о встроенном причале, использование jetty xml не очень подходит в этой ситуации. Теперь, если вы используете диспетчерский дистрибутив, этот список конфигураций управляется для вас на основе ваших настроенных модулей (см. Документацию jetty.home, jetty.base и start.ini) –

+0

@JoakimErdfelt Возможно ли это сделать без военного файла ? – niklabaz

1

В дополнение к добавлению необходимых конфигураций, как указано в вышеупомянутом ответе, необходимо, чтобы заставить Jetty сканировать ток скомпилированные классы проекта, которые Jetty игнорирует по умолчанию. Чтобы сделать это, просто вызовите следующий на вашем WebAppContext:

context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/classes/.*")

Пожалуйста, смотрите полный пример здесь (в Котлин): https://github.com/mvysny/vaadin-on-kotlin/blob/master/vok-example-crud/src/test/java/com/github/vok/example/crud/Server.kt

Это работает удивительный и обнаруживает все @WebServlets, @WebListeners и другие.