无法调用Springboot @Controller,但@RestController可以工作

时间:2017-12-22 08:43:33

标签: spring spring-boot

我的控制器已使用@Controller注释,无法调用 - 浏览器显示

  

出现意外错误(type = Not Found,status = 404)。

但是,如果使用@RestController进行注释,则可以正常工作。我的SpringBoot版本:1.5.3.RELEASE

我的控制器:(在com.sbootsecurityjsp.controller中)

@Controller
public class LoginController {    
    @RequestMapping(value = "/login", method= RequestMethod.GET )
    public String login() {
        return "Login Controller";
    }   
}

主类:(在com.sbootsecurityjsp中)

@SpringBootApplication(scanBasePackages = {"com.sbootsecurityjsp"}) 
public class SbootSecurityJspApplication {    
    public static void main(String[] args) {
        SpringApplication.run(SbootSecurityJspApplication.class, args);
    }
}

我很好奇为什么如果@RestController注释有效,@ Controller不能工作。如果组件扫描不起作用,@ RestController也不应该工作。我也添加了scanbasePackages。即使没有scanbasePackages,它也不起作用。

顺便说一句,当应用程序启动时,日志也显示如下一行:

INFO 532 --- [  restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/login],methods=[GET]}" onto public java.lang.String com.sbootsecurityjsp.controller.LoginController.login()

为什么使用@Controller是为了区分对页面和休息调用的请求。如果我错了,请纠正我。我的想法是使用@RestController进行REST请求,另一方面使用@Controller进行与页面相关的请求 - 重定向到JSP或任何与视图相关的逻辑。这是一种不好的做法吗?

1 个答案:

答案 0 :(得分:2)

为什么在使用@Controller注释时返回404?

使用@Controller时,Spring希望您在String方法中返回的@RequestMapping对应于您要将用户重定向到的页面。

@RequestMapping(value = "/login", method= RequestMethod.GET )
public String login() {
    return "Login Controller";
}

在这里,Spring会尝试将用户重定向到找不到的Login Controller.jsp,从而返回404

为什么在使用@RestController

时它不会返回404

使用@RestController时,您返回的String未映射到任何页面。相反,Spring只是将其转换为例如一个JSON响应。这就是为什么它没有给你404

提议的解决方案

如果你有一个名为login.jsp的jsp页面,只需返回"login"

@RequestMapping(value = "/login", method= RequestMethod.GET )
public String login() {
    return "login";
}