#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:
Кажется, у меня все работает нормально. Что я сделал:
-
В моем
pom.xml
случае у меня есть зависимость отorg.wildfly.swarm:undertow
(для Servlet API) иorg.wildfly.swarm:jaxrs
(для JAX-RS). И, конечно же, плагин Swarm Maven. -
Для сервлета у меня есть только этот класс:
@WebServlet("/")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("Hello from servlet");
}
}
- Для 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 файлы выглядят почти одинаково.