【问题标题】:Springboot @Controller cannot be invoked, but @RestController worksSpringboot @Controller 无法调用,但@RestController 有效
【发布时间】:2017-12-22 08:43:33
【问题描述】:

我的控制器被@Controller注解了,无法调用
- 浏览器显示

出现意外错误(类型=未找到,状态=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 或与视图相关的任何逻辑。这是一个不好的做法吗?

【问题讨论】:

  • “无法调用”是什么意思?因为它被忽略了?
  • @Synch。感谢您的关注。如果 localhost:8080/login 被调用,它返回 404

标签: spring spring-boot


【解决方案1】:

为什么我使用@Controller注解会返回404?

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

@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";
}

【讨论】:

  • 感谢您的解释。我的问题是,为什么日志会显示控制器被指向及其方法? (INFO 532 --- [restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping : 将“{[/login],methods=[GET]}”映射到公共 java.lang.String com.sbootsecurityjsp.controller.LoginController.login() )为什么寻找页面而不是控制器? - 是因为 @Controller 吗?坦率地说,我的尝试是按照您的建议添加一个页面。那没起效。然后我尝试通过让控制器返回一个文本来测试这个控制器是否工作。
  • 它不是在寻找控制器的页面 INSTEAD。日志表示该方法映射到端点/login。所以如果你去那个localhost:8080/login,就会调用相应的方法。如果你在那里放置一个调试断点,你会看到断点被激活。一旦您返回结果 ("login"),Spring 将在您使用 @Controller 时寻找要显示的页面。在@RestController 中没有这样做
  • 我的应用程序开始工作了。谢谢你的解释。 jsp 页面存在映射问题。顺便说一句,我了解了这些控制器之间的行为。非常感谢您的支持
猜你喜欢
  • 2019-03-25
  • 2016-12-29
  • 2020-03-16
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 2021-04-12
  • 2015-03-06
相关资源
最近更新 更多