#java #spring-boot #thymeleaf
#Ява #пружинный ботинок #тимелиаф
Вопрос:
У меня есть этот метод в моем RestController:
@GetMapping("/") public Monolt;Stringgt; index(Model model) { model.addAttribute("images", imageService.findAllImages()); return Mono.just("index"); }
Когда я запускаю свое приложение, я получаю страницу, на которой нет ничего, кроме текста index
в левом верхнем углу. Если я обновлю return Mono.just("index");
до return Mono.just("foo");
, то foo
это отобразится в левом верхнем углу.
Я ожидал, что файл resources/templates/index.html
будет отображаться в браузере. Как мне это исправить?
Комментарии:
1. Снабжено ли оно аннотациями
Controller
илиRestController
аннотациями ? Пожалуйста, попробуйте один раз сController
аннотацией.
Ответ №1:
Как упоминал Paras, основная проблема, вероятно, заключается в неправильной аннотации поверх вашего класса контроллера.
@RestController
и @Controller
ведите себя по-другому, когда дело доходит до обработки шаблонов.
@RestController
просто возвращает в основном ваш объект (в данном случае тот, который создается Mono.just(...)
), который обычно преобразуется в JSON или обычный текст (в зависимости от настроек).
@Controller
Аннотация обычно означает, что возврат вашего метода контроллера должен рассматриваться как путь от корня шаблона к HTML
шаблону. В этом случае вам действительно не нужна Mono.just()
конструкция (которая iirc создает поток для реактивной разработки) — просто верните String
вот так:
@Controller public class MyController { private ImageService imageService; @RequestMapping( "/" ) // could also be @GetMapping( "/" ) public String index( Model model ) { model.addAttribute("images", imageService.findAllImages()); return "index"; } @Autowired public void setImageService( ImageService imageService ) { this.imageService = imageService; } }
Также я не мог понять, почему именно вы пытались использовать контроллер Rest для отображения страницы. Если вы хотите асинхронно загружать содержимое страницы, вы можете просто определить простой контроллер и вызвать указанный URL-адрес в качестве ajax get
. Но обратите внимание , что при таком подходе вы снова получите полную страницу (с lt;htmlgt;
lt;headgt;
и т. Д.) Внутри своей страницы. Чтобы предотвратить это, оберните свой контент index.html
таким образом:
lt;!-- head, meta etc --gt; lt;bodygt; lt;th:block th:fragment="content"gt; lt;!-- page content goes here --gt; lt;/th:blockgt; lt;/bodygt;
и в вашем index( Model model )
методе в контроллере измените возвращаемую строку на "index :: content"
.
Если это не поможет, пожалуйста, предоставьте свое определение бобов thymeleaf.