Вернуть HTML-страницу из контроллера Spring

У меня есть приложение Spring Boot, настроенное как REST api. Теперь я также хочу иметь возможность предоставлять клиенту простые HTML-страницы без использования какого-либо механизма шаблонов, такого как Thymeleaf. Я хочу, чтобы доступ к HTML-страницам подпадал под те же ограничения безопасности, которые установлены Spring Security с использованием WebSecurityConfigurerAdapter, уже присутствующего в моем приложении.


Я пробовал использовать Controller:

@Controller
public class HtmlPageController {
    @RequestMapping(value = "/some/path/test", method = RequestMethod.GET)
    public String getTestPage() {
        return "test.html";
    }
}

и поместите файл test.html в /resources/test.html или /webapp/WEB-INF/test.html.

Каждый раз, когда я пытаюсь получить доступ к странице по адресу localhost:8080/some/path/test, возвращается 404.

Как мне заставить это работать?

попробуйте return "test";

user7294900 14.11.2018 10:43

Если я это сделаю, сервер вместо этого выбрасывает Circular view path [test]: would dispatch back to the current handler URL [/some/path/test] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

darksmurf 14.11.2018 10:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
20 531
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ваши файлы html, js и css должны находиться в каталоге src / main / resources / static. и ваш оператор возврата вы можете попробовать удалить .html.

@RestController
public class HtmlPageController {
    @GetMapping("/some/path/test")
    public String getTestPage() {
        return "test";
    }
}

Если я это сделаю, сервер вместо этого выбрасывает Circular view path [test]: would dispatch back to the current handler URL [/some/path/test] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

darksmurf 14.11.2018 11:05

замените @ Controller на @ RestController и добавьте зависимость тимелеафа.

Reactive_learner 14.11.2018 13:52

В вопросе конкретно говорится, что я не хочу использовать какой-либо механизм шаблонов, например Thymeleaf.

darksmurf 14.11.2018 13:58

@RestContoller подойдет. Нет необходимости добавлять зависимость от тимелеафа

Reactive_learner 14.11.2018 14:52

Нет, не будет. @RestController - это то же самое, что аннотировать метод с помощью @ResponseBody, который затем вернет строку «test» в теле ответа.

darksmurf 14.11.2018 14:55

См. учебный пример, как определить представление html в конфигурации Spring MVC

@Bean
public InternalResourceViewResolver htmlViewResolver() {
    InternalResourceViewResolver bean = new InternalResourceViewResolver();
    bean.setPrefix("/WEB-INF/html/");
    bean.setSuffix(".html");
    bean.setOrder(2);
    return bean;
}
  • setOrder установлен на 2, потому что он включает также поддержку JSP в примере

Также вам нужно изменить, чтобы вернуть без суффикса .html

return "test.html";

Существует механизм Spring MVC для предоставления статических ресурсов.

В классе конфигурации переопределите этот метод:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry
        .addResourceHandler("some/path/*.html")
        .addResourceLocations("/static/");
}

И поместите свои html-файлы в папку src/main/webapp/static/.

Если вы запросите some/path/test.html (обратите внимание на .html), он вернет файл test.html, расположенный в папке static.

Очевидно, вы можете использовать другую папку или более сложную структуру каталогов.

Таким образом, вам не нужно создавать контроллер. Обратите внимание, что ваш класс конфигурации должен реализовывать WebMvcConfigurer.

Ответ принят как подходящий

Хорошо, очевидно, Spring Boot поддерживает это без какой-либо дополнительной конфигурации или контроллеров.

Все, что мне нужно было сделать, это поместить HTML-файл в правильный каталог /resources/static/some/path/test.html, и его можно будет найти по адресу localhost:8080/some/path/test.html.

Мои попытки изменить каталог, из которого обслуживается файл, не увенчались успехом. Кажется, что, предоставляющий отдельный @EnableWebMvc (необходимый для настройки обработчиков ресурсов), нарушает конфигурацию Spring Boot. Но я могу жить с использованием каталога /static по умолчанию.

Другие вопросы по теме