У меня есть приложение 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.
Как мне заставить это работать?
Если я это сделаю, сервер вместо этого выбрасывает 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.)




Ваши файлы 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.)
замените @ Controller на @ RestController и добавьте зависимость тимелеафа.
В вопросе конкретно говорится, что я не хочу использовать какой-либо механизм шаблонов, например Thymeleaf.
@RestContoller подойдет. Нет необходимости добавлять зависимость от тимелеафа
Нет, не будет. @RestController - это то же самое, что аннотировать метод с помощью @ResponseBody, который затем вернет строку «test» в теле ответа.
См. учебный пример, как определить представление html в конфигурации Spring MVC
@Bean public InternalResourceViewResolver htmlViewResolver() { InternalResourceViewResolver bean = new InternalResourceViewResolver(); bean.setPrefix("/WEB-INF/html/"); bean.setSuffix(".html"); bean.setOrder(2); return bean; }
Также вам нужно изменить, чтобы вернуть без суффикса .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 по умолчанию.
попробуйте
return "test";