首页 > 解决方案 > 控制器不允许请求发布,但可以正常工作

问题描述

我有一个带cors的弹簧靴。我想设置一个静态页面控制器,我想为相同的 post/get 请求返回一个静态 html 页面。

获取请求有效,但我有发布请求:{“时间戳”:1563296215801,“状态”:405,“错误”:“方法不允许”,“消息”:“不支持请求方法'POST'”, “路径”:“/测试”}

我的代码:

@Controller
@RequestMapping("/")
public class StaticPageController implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/test").setViewName(
                "test");
    }

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

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("folder/");
        resolver.setSuffix(".html");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

}

通过发布请求,我的断点在'return "test";' 被解雇。但是在我遇到405错误之后......

有任何想法吗 ?

标签: spring-bootcontroller

解决方案


您正面临这个问题,因为除了配置 GET 端点之外/test,您还配置了ViewControllerRegistry 将视图返回test/testurl。

ViewControllerRegistry每当您想要在不需要控制器的情况下提供静态内容时都会配置。因此,尝试删除它,您的控制器方法应该按预期工作,因为默认情况下仅支持 GET ViewControllerRegistry

  • 协助注册预先配置有状态代码和/或视图的简单自动化控制器。ViewControllerRegistry 注册视图控制器。
  • 使用 ViewControllerRegistry 时,我们不需要创建实际的控制器类。当我们只需要将 URL 映射到
    视图时使用它。addViewController(String urlPath):它
    为给定的 URL 添加一个视图控制器。
  • 此方法返回 ViewControllerRegistration 并使用 ViewControllerRegistration.setViewName()
    映射相应的视图。addRedirectViewController(String urlPath, String
    redirectUrl):它将一个 URL 映射到另一个 URL 以在其上重定向。它已
    在春季 4.1 中引入。
  • addStatusController(String urlPath, HttpStatus statusCode):它用给定的状态码映射一个 URL。它也在春季 4.1 中引入。

尝试使用:

@Controller
@RequestMapping("/")
public class StaticPageController implements WebMvcConfigurer {

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

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("folder/");
        resolver.setSuffix(".html");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

}

推荐阅读