SpringBoot - Controller и RequestMapping всегда возвращают 404 - PullRequest
0 голосов
/ 12 октября 2019

Я пробую упрощенную версию примера здесь . Проект был настроен в VSCode с инициализатором, который поставляется с расширением Springboot.

DemoApplication.java

package com.sample.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

CalculatorController.java

package com.sample.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class CalculatorController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }
}

Я запускаю приложение из VSCode и получаю к нему доступ: http://localhost:8080/. Я продолжаю получать 404 ошибку. Когда я изменяю аннотацию @Controller на аннотацию @RestController, она работает. Также существует resources\templates\index.html.

Чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 14 октября 2019

Аннотация @RestController в Spring MVC - это не что иное, как сочетание аннотации @Controller и @ResponseBody. Он был добавлен в Spring 4.0, чтобы упростить разработку веб-сервисов RESTful в среде Spring.

Работа @Controller заключается в создании карты объекта модели и поиске вида, но @RestController просто возвращает объект иДанные объекта напрямую записываются в HTTP-ответ в виде JSON или XML.

@SuppressWarnings({})
@RestController
public class TestController {
    @PostMapping("/test/1")
    public Object Test1(@RequestBody HashMap<String, String> obj) throws ParseException, IOException {
        return null;
    }

Подробнее: https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html#ixzz62Jw1WOs3

0 голосов
/ 16 октября 2019

@ RestController является комбинацией @Controller и @ ResponseBody.So метод обработки запросов возвращает объекты в HttpResponse в виде Json или XML, поэтому @ResponseBody не требуется.

@RestController
public class UserRestController { }

@Controller
@ResponseBody
public class UserController { }

@ ResponseBody - это аннотация Springкоторый связывает метод, который возвращает значение с телом веб-ответа. Он сообщает контроллеру, что возвращаемый объект автоматически сериализуется в JSON и передается обратно в объект HttpResponse.

0 голосов
/ 14 октября 2019

В контексте очень высокого обзора Spring MVC разработан с шаблоном проектирования Front Controller, где сервлет Dispatcher будет получать все запросы и вызывать соответствующий обработчик, чтобы вызывать метод вашего контроллера, если ваш класс контроллера аннотирован аннотацией @Controller. Сервлет диспетчера посчитал это возвращаемое значение и попытался найти View в вашем MVC, так что вам нужно настроить любую из реализаций ViewResolver, в вашем случае вам нужно настроить InternalResourceViewResolver и Themeleaf с соответствующими местоположениями представления.

если ваши контроллерыаннотируется @RestController, возвращаемое значение обработчика будет рассматриваться как ответ Http. Сервлет-диспетчер не будет смотреть какие-либо представления (он будет считать возвращаемое значение как тело ответа http)

вы можете добиться того же с аннотацией @ControllerПросто добавьте эту аннотацию @ResponseBody в ваш метод-обработчик (возвращаемое значение рассматривается как http-ответ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...