Текст «индекс» отображается вместо содержимого моего index.html файл

#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.