我的控制器已使用@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或任何与视图相关的逻辑。这是一种不好的做法吗?
答案 0 :(得分:2)
使用@Controller
时,Spring希望您在String
方法中返回的@RequestMapping
对应于您要将用户重定向到的页面。
@RequestMapping(value = "/login", method= RequestMethod.GET )
public String login() {
return "Login Controller";
}
在这里,Spring会尝试将用户重定向到找不到的Login Controller.jsp
,从而返回404
。
使用@RestController
时,您返回的String
未映射到任何页面。相反,Spring只是将其转换为例如一个JSON响应。这就是为什么它没有给你404
。
如果你有一个名为login.jsp
的jsp页面,只需返回"login"
:
@RequestMapping(value = "/login", method= RequestMethod.GET )
public String login() {
return "login";
}