Столкновение сервлета Java EE и пути REST

#rest #jsp #servlets #jakarta-ee #wildfly-swarm

#rest #jsp #сервлеты #джакарта-ee #wildfly-рой

Вопрос:

Я пытаюсь написать веб-приложение Java, которое предоставляет как HTML, так и REST интерфейс. Я хотел бы создать сервлет, который предоставлял бы HTML-интерфейс с использованием JSP, но данные также должны быть доступны через REST.

У меня уже есть что-то подобное для ОСТАЛЬНЫХ:

 @javax.ws.rs.Path("/api/")
public class RestAPI {

   ... // Some methods
}
  

и

 @WebServlet("/servlet") 
public class MyServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.getWriter().write("Howdy at ");
    }
}
  

Теперь, когда я меняю аннотацию @WebServlet(«/servlet») на @WebServlet(«/»), сервлет перестает работать, вероятно, из-за столкновения пути с ОСТАЛЬНЫМИ.

Как я могу предоставить REST для определенного пути и HTML в корневом каталоге?

Спасибо тебе, Лукас Дженделе

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

1. Кстати, должна быть возможность обслуживать HTML-интерфейс с помощью JAX-RS. Фактически, должно быть даже возможно обслуживать HTML-интерфейс по тем же URL, что и API — я не пробовал это с Swarm, но я видел, как это делается с Jetty Jersey, поэтому я не понимаю, почему это не могло работать и с Swarm.

Ответ №1:

Кажется, у меня все работает нормально. Что я сделал:

  1. В моем pom.xml случае у меня есть зависимость от org.wildfly.swarm:undertow (для Servlet API) и org.wildfly.swarm:jaxrs (для JAX-RS). И, конечно же, плагин Swarm Maven.

  2. Для сервлета у меня есть только этот класс:

 @WebServlet("/")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("Hello from servlet");
    }
}
  
  1. Для JAX-RS у меня есть эти 2 класса:
 @ApplicationPath("/api")
public class RestApplication extends Application {
}
  
 @Path("/")
public class HelloResource {
    @GET
    public Response get() {
        return Response.ok().entity("Hello from API").build();
    }
}
  

Для тестирования я запускаю curl http://localhost:8080/ и curl http://localhost:8080/api . Результаты соответствуют ожиданиям. (Может быть, мой пример слишком прост?)

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

1. Спасибо! Я попробовал именно то, что вы опубликовали, с единственной разницей в том, что я использую gradle вместо maven. Это не работает. Я включил gradle и основной файл в вопрос, так что вы можете взглянуть.

2. Большое вам спасибо. Проблема заключалась в том, что мне не хватало класса RestApplication. Опубликованный вами пример отлично работает. Возможно ли указать несколько методов GET в одном классе и указать @@Path для методов, а не для класса? Я попытался переместить аннотацию пути в метод, однако у меня это не сработало.

3. В конце концов я это понял. Необходимо задать аннотацию пути как для класса, так и для методов.

4. Не могли бы вы, пожалуйста, опубликовать свой pom.xml файл? Я пытаюсь перейти с Gradle на Maven и сталкиваюсь с некоторыми трудностями. Спасибо.

5. У меня здесь есть пара проектов Swarm «игровой площадки»: github.com/ladicek/swarm-tinies Все их pom.xml файлы выглядят почти одинаково.