Вернуть HTML-страницу с помощью RestController в Spring Boot

Я пытаюсь получить HTML-страницу, которую я создал. Это структура моего проекта:

Это класс "IndexController":

@RestController
@AllArgsConstructor
@RequestMapping(path = "/webpage")
public class IndexController {

        @GetMapping(path = {"mainpage"})
        @ResponseBody
        public String index(){
            return "Index";
        }
    
        @PostMapping("/check")
        public String CheckDataset(@ModelAttribute CheckModel checkModel){
            System.out.println(checkModel);
            return null;
        }
    
    }

Когда я открываю веб-страницу HTML непосредственно из intellij:

Открывается отлично, но когда я пытаюсь открыть HTML из Spring Boot, возвращается только строка «Index».

У вас есть идеи, как это решить?

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

Ответы 2

Чтобы вернуть HTML-страницу (представление), вы должны использовать Spring MVC, то есть @Controller вместо @RestController и вернуть ModelAndView с index в качестве имени представления:

@Controller
@AllArgsConstructor
@RequestMapping("/webpage")
public class IndexController {

    @GetMapping(path = {"mainpage"})
    public ModelAndView index() {
        final var modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        return modelAndView;
    }

    // other methods
}

Спасибо! Это не работает в моем случае, но спасибо за ваше предложение.

Al3x21 18.04.2023 14:02
Ответ принят как подходящий

Обратите внимание, что ваш класс IndexController не должен иметь @RestController, если вам нужно показать HTML-страницу. Он должен иметь только @Controller.

Простыми словами @RestController = @Controller + @ResponseBody

В вашем случае аннотация @RestController, которую вы использовали, делает все методы внутри нее @ResponseBody по умолчанию, и вам не нужно явно указывать

@ResponseBody аннотация не показывает вид, а отправляет ответ String.

Действия по устранению этой проблемы:

  1. Измените аннотацию @RestController на @Controller на уровне класса
  2. Удалите @ResponseBody из метода, в котором вы планируете показывать HTML.

Таким образом, ваш код будет

@Controller
@AllArgsConstructor
@RequestMapping(path = "/webpage")
public class IndexController {

    @GetMapping(path = {"mainpage"})
    public String index(){
        return "Index";
    }

   //Other methods
    
}

Просто убедитесь, что у вас есть зависимость spring-boot-starter-thymeleaf в вашем POM.xml.

Спасибо.

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