Не удается получить ответ с помощью @Controller, а @RestController работает нормально - PullRequest
1 голос
/ 30 мая 2020

Я пытаюсь сопоставить URL-адрес /function/hash в моем проекте с определенной c HTML страницей html/hashcode.html. Это проект весенней загрузки без использования тимелеафа.

Это мой код:

// package ...;

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

@Controller
public class FunctionController {
    @RequestMapping("/function/hash")
    public String hashPage(Model m) {
        return "html/hashcode.html";
    }
}

Приведенный выше код возвращает 404, когда я пытаюсь получить доступ к localhost:8080/function/hash.

Я также пробовал

@Controller
@RequestMapping("/function")
public class FunctionController {
    @RequestMapping("/hash")
    public String hashPage(Model m) {
        return "html/hashcode.html";
    }
}

, который также дает 404, когда я go до localhost:8080/function/hash.

Непосредственно использование @RequestMapping("/hash") для сопоставления страницы с /hash работает, в Если вы задаетесь вопросом, неверно ли возвращаемое значение функции.

Я также обнаружил, что использование многослойного URL-адреса, например @RequestMapping("/api/test"), работает в @RestController классах, но почему-то не работает в этом @Controller класс выше.

Ответы [ 5 ]

1 голос
/ 30 мая 2020

Возврат "/html/hashcode.html" (префикс /) и создание <project-root>/src/main/resources/static/html/hashcode.html

@Controller
public class FunctionController {
    @RequestMapping("/function/hash")
    public String hashPage(final Model m) {
        return "/html/hashcode.html";
    }
}

При возврате "html/hashcode.html":

o.s.web.servlet.DispatcherServlet        : "FORWARD" dispatch for GET "/function/html/hashcode.html", parameters={}

С другой стороны , при возврате "/html/hashcode.html":

o.s.web.servlet.DispatcherServlet        : "FORWARD" dispatch for GET "/html/hashcode.html", parameters={}
0 голосов
/ 30 мая 2020

Если файлы html являются статическими c ресурсами, учитывайте поддержку c содержимого в Spring Boot.

Настройте spring.resources.static-locations, чтобы указать расположение ресурсов .

spring.resources.static-locations=file:/opt/files/,classpath:/static-files

И установите шаблон сопоставления, если вы не хотите сопоставить его с root путем.

pring.mvc.static-path-pattern=/content/**

(или spring.webflux.static-path-pattern для приложения Spring webflux)

Теперь вы можете просматривать ресурсы через http://localhost: 8080 / content / some. html

0 голосов
/ 30 мая 2020

добавить аннотацию @ResponseBody, @Controller - это обычная аннотация, которая используется для обозначения класса как Spring MVC Controller, а @RestController - это специальный контроллер, используемый в веб-сервисах RESTFul и эквивалент @Controller + @ResponseBody

если вы добавите @ResponseBody, он будет работать. используйте код ниже

// package ...;

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

@Controller
public class FunctionController {

    @RequestMapping("/function/hash")
    public @ResponseBody String hashPage(Model m) {
        return "html/hashcode.html";
    }
}
0 голосов
/ 30 мая 2020

@RestController - комбинация @Controller + @ResponseBody. При использовании @Controller мы должны добавить @ResponseBody с нашими методами. Вы можете найти более подробную информацию здесь

@Controller
public class MappingController {

    @RequestMapping("/endpoint1") //returns 404
    public String endPoint1() {
        return "Hello endpoint1";
    }

    @RequestMapping("/endpoint2") //works well because of @ResponseBody
    public @ResponseBody String endPoint2() {
        return "Hello endpoint2";
    }
}

Добавьте @ResponseBody, и оба они должны работать нормально

@Controller
public class FunctionController {
    @RequestMapping("/function/hash")
    public @ResponseBody String hashPage(Model m) {
        return "html/hashcode.html";
    }
}

@Controller
@RequestMapping("/function")
public class FunctionController {
    @RequestMapping("/hash")
    public @ResponseBody String hashPage(Model m) {
        return "html/hashcode.html";
    }
} 
0 голосов
/ 30 мая 2020

используйте path в сопоставлении запросов.

Пример:

@RequestMapping(path="/hash")

...