bit_rainbow
@bit_rainbow

Java стенделон сервер с РЕСТом и статическим вебом — как решить проблему?

В в депенденси один артефакт:
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-grizzly2-http</artifactId>
     <version>2.10.1</version>
 </dependency>


Код:
public static void main(String[] args) {
        final URI baseUri = UriBuilder.fromUri("http://localhost").port(9998).build();

        //add test configs
        Set rest = new HashSet<Class>();
        rest.add(TestResource.class);
        final ResourceConfig config = new ResourceConfig(rest);

        HttpServer server = GrizzlyHttpServerFactory.createHttpServer(baseUri, config);

        try {
            //server.getServerConfiguration().addHttpHandler(new StaticHttpHandler("web/"),"/w");

            server.getServerConfiguration().addHttpHandler(new StaticHttpHandler("src/main/resources/web"),"/");

            server.start();
            System.out.println();
            System.out.println("Press enter to stop the server...");
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            server.shutdownNow();
        }
    }


В таком случае рест методы не доступы, но статическая страница на "/" отрывается. Скрин.

Но когда изменяю часть кода на:
server.getServerConfiguration().addHttpHandler(new StaticHttpHandler("src/main/resources/web"),"/www");


В таком случае все работает, но статическая страница будет на /www, но не на /
Скрин

Как сделать что бы статика была на / а апи на /api?
  • Вопрос задан
  • 2544 просмотра
Пригласить эксперта
Ответы на вопрос 1
@iryndin
Маппинг "/" означает, что у вас соответствующим хэндлером будут обрабатываться все пути, начинающиеся с "/", то есть и "/" и "/api".

Соответственно, когда маппинг установлен на "/www", то установленным хэндлером обрабатываются пути, начинающиеся с "/www". Пути, начинающиеся с "/api" он уже не обрабатывает, и именно поэтому ваш рест-хендлер (кстати, в приведенном вами коде не видно рест-обработчика) и работает (т.е. обслуживает запросы по пути "/api").

Все эти веб-сервера (томкат, гриззли, джетти и т. п.) ищут соответствующий хэндлер по урлу очень просто: они пробегаются по списку хэндлеров и сравнивают их маппинги с пришедшим урлом. Первый подошедший хэндлер и будет обрабатывать запрос по этому урлу. Для того, чтобы поместить статику на "/", а рест-апи на "/api", вам просто нужно расположить маппинг на "/api" в самом начале списка хэндлеров, а маппинг на самый общий путь ("/") в самом конце. Тогда все будет отрабатывать корректно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы