Встроенный jetty 9 не работает для @Webservlet

#java #embedded-jetty

#java #встроенный-jetty

Вопрос:

Я использую java 11 и встроенный jetty 9 для моего приложения JavaEE, я пытаюсь использовать аннотацию @Websevlet для публикации моего сервлета, но это не работает, я не знаю почему. Мой начальный класс java

 import org.eclipse.jetty.annotations.AnnotationConfiguration;

import org.eclipse.jetty.server.Server;

import org.eclipse.jetty.webapp.*;

public class Start  {

    public static  void main(String[] args) throws Exception {
        Server server = new Server(80);

        WebAppContext wacHandler = new WebAppContext();
        wacHandler.setConfigurations(new Configuration[]
                {
                        new AnnotationConfiguration(),
                        new WebInfConfiguration(),
                        new WebXmlConfiguration(),
                        new MetaInfConfiguration(),
                        new FragmentConfiguration(),
                        new JettyWebXmlConfiguration()
                });
        server.setHandler(wacHandler);

        server.start();
        server.join();
    }
}
  

Мой класс hello world

 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( "/getservlet")
public class ServletX extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
      
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Hi there..</h1>");
    }

}

  

У меня нет web.xml конфигурация, что я должен делать?

Комментарии:

1. Где находится ServletX? Это в файле WAR, который использует встроенный Jetty? или это где-то еще, например, в uberjar или в пути к классу контейнера?

2. servletX в файле WAR, который использует встроенный jetty

3. Тогда почему вы не ссылались на этот файл WAR в своем примере кода? У WebAppContext должно быть setWar() или .setBaseResource() , вызываемое против WAR (или распакованный каталог webapp), чтобы оно работало.

Ответ №1:

Если ServletX находится в файле war, то есть в WEB-INF/classes/ каталоге архива, то объявленная вами конфигурация (в частности, AnnotationConfiguration ) выполнит сканирование байт-кода файла WAR и загрузит @WebServlet аннотацию.

Также обратите внимание, что WebAppContext потребуется указать на этот файл WAR, чего не делают ваши примеры кода.

 WebAppContext wacHandler = new WebAppContext();
waxHandler.setWar("/path/to/myapp.war");
// ... more setup
  

Но! если этого ServletX нет в файле WAR, но вместо этого он размещен в вашем классе embedded-jetty Start , то вам нужно предоставить контейнер сервлета для проверки на этапе сканирования байт-кода.

Вы всегда можете включить ведение журнала ОТЛАДКИ / ТОЧНОГО уровня для именованного регистратора org.eclipse.jetty и посмотреть, какие действия выполняются в отношении развертывания и сканирования байт-кода.

Комментарии:

1. Спасибо, сэр, за вашу помощь, у меня есть второй случай, возможно, servletX в моем классе запуска embedded-jetty, можете ли вы предоставить более подробную информацию об этом случае.