【问题标题】:web.servlet.PageNotFound ,Request method 'GET' not supported,Springweb.servlet.PageNotFound ,不支持请求方法 'GET',Spring
【发布时间】:2014-10-28 09:48:07
【问题描述】:

我在 Spring MVC 控制器中遇到了一个奇怪的问题。

我的 webapp 文件夹中有四个页面

@Controller
public class WelcomeController {

    @RequestMapping(value="/wodi/welcome",method=RequestMethod.GET)
    public String welcome(){
        return "redirect:/pages/webwelcome.html";
    }
}

刚才,找到页面http://localhost:8080/pages/webwelcome.html很好,但是现在我有浏览器说的错误:

There was an unexpected error (type=Method Not Allowed, status=405).
Request method 'GET' not supported

我不知道我做了什么影响了它。

我读过WARN : org.springframework.web.servlet.PageNotFound - Request method 'GET' not supported

但这与我的情况不同,因为我使用的是“GET”方法。

下面是我用来启动 Spring 应用程序的 Application.java

@Configuration
@EnableAutoConfiguration
@ComponentScan({"hello","wodinow.weixin.jaskey"})
public class Application {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);

        System.out.println("Let's inspect the beans provided by Spring Boot:");

        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames) {
            System.out.println(beanName);
        }
    }

    @Bean
    public CommandService commandService(){
        return CommandService.getInstance();
    }

}

【问题讨论】:

  • 发布配置文件web.xml和spring context.xml文件代码。
  • @JavaDev,我没有用那个,我用Spring Boot和Application.java来运行程序。
  • 在什么请求下您会收到错误消息:http://localhost:8080/pages/webwelcome.htmlhttp://localhost:8080//wodi/welcome?看起来你正在使用 eclipse,你清理然后重建项目了吗?
  • @SergeBallesta 这两个 URL 都有相同的错误,我尝试清理项目,但仍然相同

标签: java spring spring-mvc


【解决方案1】:

就我而言,一切都很好。但是我的控制器有问题

那是我的问题 @RequestMapping(method = RequestMethod.GET)

为此改变:

@RequestMapping(value = "/usuario", method = RequestMethod.GET)

它可以工作

【讨论】:

    【解决方案2】:

    除非您在配置中添加了非常奇怪的东西,否则(嵌入式)容器应该能够提供不在 WEB-INF 下的静态内容或 JSP。唯一可能出现问题的用例是,如果您将 Spring DispatcherServlet 映射到 /*,而忘记允许提供静态资源。

    您将在我的另一篇帖子Match for root url and serving of static resources 中找到更多关于静态资源服务的参考资料。

    但通常,在控制器中,您不会重定向到 HTML 页面,而是给出视图的名称,然后视图解析器会找到合适的视图。

    【讨论】:

    • "你将 Spring DispatcherServlet 映射到 /* 忘记允许静态资源的服务。"我这样做的可能方式是什么?你能否给我看一个代码示例,用于最后一个“但给出视图名称并且视图解析器找到合适视图的解决方案”
    • 谢谢!我发现我的请求映射方法之一(post 方法)没有声明任何“值”,它是否默认路由到“/”?我添加了一个 value="/some_path",我的解决方案正在工作!谢谢!如果可能的话,我仍然希望得到您最后建议的一个示例:给出视图的名称,视图解析器会找到合适的视图。
    【解决方案3】:

    在您的应用程序配置中注册的 ViewResolver 负责从给定的 URL 解析页面。

    示例:用于将 /welcome 等 URL 解析为相应 JSP 文件 /pages/welcome.jsp 的配置

    <bean
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
      <property name="prefix" value="/pages/" />
      <property name="suffix" value=".jsp" />
    </bean>
    

    但是,JSP 页面是动态的,需要特殊处理。对于普通 html 页面等静态资源,为您的 pages 文件夹设置静态映射就足够了。

    <mvc:resources location="/pages/" mapping="/**" />
    

    这将导致文件夹 /pages 中的所有资源都映射到以“/”开头的 URL。例如:/pages/welcome.html 可以被 http://yourdomain/welcome.html 访问

    如果你想为一个特定的 URL 设置视图解析器,你可以在配置中使用视图控制器:

    <mvc:view-controller path="/wodi/welcome" view-name="/pages/webwelcome.html"/>
    

    更新:

    当您使用带有 @EnableAutoConfiguration 的 Spring Boot 时,您已经在使用第二种方法。 Here 你可以从 AutoConfiguration 实现中看到一个代码 sn-p。它显示了一个 ResourceHandler 被添加到 URL /** 和一些预定义的locations

    如果您想要自定义 URL 映射,我建议您在纯 Spring MVC 配置中使用上述方法之一。 Here 是启用 Spring MVC 配置的文档。您可以自行决定是否使用基于 xml 或注解的配置。

    【讨论】:

    • 我不确定你的意思,我没有使用任何 xml 来配置我的应用程序,我确实有一个 web.xml 但我没有创建它,maven 创建它但我没有放里面有什么新东西。你能发布一个完整的代码示例吗?
    • OP 通过 redirect 进入 html 页面(好吧,这很不寻常):不应该涉及视图解析器配置。
    • @SergeBallesta,您能告诉我重定向到 html 的常见方式吗?我是Spring MVC的新手,现有项目之前是用Servlet构建的,现在我尝试将其重构为spring
    • @Jaskey,我编辑了我的答案,为您提供了一些可能的 Spring MVC 配置示例。
    • @Jaskey 我更新了我的答案以详细说明您的配置。
    猜你喜欢
    • 2017-10-21
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多