Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Spring MVC响应404并报告“在DispatcherServlet中找不到URI为[…]的HTTP请求的映射”?_Java_Spring_Spring Mvc_Servlets - Fatal编程技术网

Java 为什么Spring MVC响应404并报告“在DispatcherServlet中找不到URI为[…]的HTTP请求的映射”?

Java 为什么Spring MVC响应404并报告“在DispatcherServlet中找不到URI为[…]的HTTP请求的映射”?,java,spring,spring-mvc,servlets,Java,Spring,Spring Mvc,Servlets,我正在编写一个部署在Tomcat上的Spring MVC应用程序。见下文 最后,我在com.example.controllers包中有一个@Controller 我的应用程序的上下文名称是示例。当我向 http://localhost:8080/Example/home 应用程序以HTTP状态404响应,并记录以下内容 WARN o.s.web.servlet.PageNotFound-在名为“DispatcherServlet”的“DispatcherServlet”中找不到URI为“[/E

我正在编写一个部署在Tomcat上的Spring MVC应用程序。见下文

最后,我在com.example.controllers包中有一个@Controller

我的应用程序的上下文名称是示例。当我向

http://localhost:8080/Example/home 应用程序以HTTP状态404响应,并记录以下内容

WARN o.s.web.servlet.PageNotFound-在名为“DispatcherServlet”的“DispatcherServlet”中找不到URI为“[/Example/web-INF/jsps/index.jsp]”的HTTP请求的映射 我在/WEB-INF/jsps/index.JSP上有一个JSP资源,我希望SpringMVC使用我的控制器来处理请求并转发给JSP,那么为什么它会用404来响应呢


这是一篇关于此警告消息问题的规范帖子。

您的标准Spring MVC应用程序将通过您在Servlet容器中注册的应用程序服务所有请求

DispatcherServlet查看其ApplicationContext,如果可用,查看向ContextLoaderListener注册的ApplicationContext,以获取设置请求服务逻辑所需的特殊bean

可以说是最重要的类型映射bean

对处理程序的传入请求以及前置和后置处理程序列表 基于某些条件的处理程序拦截器 根据HandlerMapping实现的不同而有所不同。最流行的实现 支持带注释的控制器,但其他实现作为 嗯

本文进一步描述了实现必须如何运行

DispatcherServlet将查找此类型的所有bean,并按照可以自定义的顺序注册它们。在为请求提供服务时,DispatcherServlet循环遍历这些HandlerMapping对象,并使用测试它们中的每个对象,以找到一个可以处理传入请求的对象,表示为标准HttpServletRequest。从4.3.x开始,如果它没有找到任何,那么它就是您看到的

在名为SomeName的DispatcherServlet中找不到URI为[/some/path]的HTTP请求的映射

并抛出或立即提交带有404 Not Found状态代码的响应

为什么DispatcherServlet找不到可以处理我请求的HandlerMapping? 最常见的HandlerMapping实现是,它将@Controller bean注册为处理程序,实际上是它们的@RequestMapping注释方法。您可以自己用@bean或其他机制声明这种类型的bean,也可以使用。这些是:

用@EnableWebMvc注释@Configuration类。 在XML配置中声明成员。 正如上面的链接所描述的,它们都将注册一个RequestMappingHandlerMappingBean和一堆其他东西。但是,如果没有处理程序,HandlerMapping就不是很有用。RequestMappingHandlerMapping需要一些@Controller Bean,因此您也需要通过Java配置中的@Bean方法或XML配置中的声明,或通过其中一个配置中的@Controller注释类的组件扫描来声明这些@Controller Bean。确保这些豆子在

如果您收到警告消息和404,并且正确配置了上述所有内容,那么您将请求发送到错误的URI,该URI不是由检测到的@RequestMapping注释处理程序方法处理的

SpringWebMVC库提供了其他内置的HandlerMapping实现。例如,地图

从URL到名称以斜杠开头的bean/

你也可以自己写。显然,您必须确保发送的请求至少与注册的HandlerMapping对象的一个处理程序匹配

如果未隐式或显式注册任何HandlerMapping bean,或者如果为true,DispatcherServlet将注册一些。它们与DispatcherServlet类在同一个包中定义。它们是BeanNameUrlHandlerMapping,与RequestMappingHandlerMapping类似,但已弃用

调试 SpringMVC将记录通过RequestMappingHandlerMapping注册的处理程序。例如,一个@Controller,比如

将在信息级别记录以下内容

将{[/example],方法=[GET],头=[X-Custom]}映射到public java.lang.String com.spring.servlet.ExampleController.example 这描述了注册的映射。当您看到未找到处理程序的警告时,请将消息中的URI与此处列出的映射进行比较。中指定的所有限制必须匹配,Spring MVC才能选择处理程序

其他HandlerMapping实现记录它们自己的语句,这些语句应该提示它们的映射及其相应的处理程序

类似地,在调试级别启用Spring日志记录,以查看Spring注册了哪些bean。它应该报告找到了哪些带注释的类、扫描了哪些包以及初始化了哪些bean。如果您期望的内容不存在,请检查您的应用程序 兰德维尤 com.lionheart.fourthed.controller.WebController.gotoIndex

我的网页再次加载。

我遇到了与**相同的问题,在名为SomeName的DispatcherServlet中找不到URI为[/some/path]的HTTP请求的映射**

经过2到4天的分析,我找到了根本原因。运行项目后未生成类文件。我点击了项目标签

项目->关闭项目->打开项目->清理->构建项目


已生成源代码的类文件。它解决了我的问题。若要检查是否已生成类文件,请检查项目文件夹中的“生成”文件夹。

尝试使用配置文件中的以下更改来修改代码。使用Java配置而不是application.properties。 不要忘记在configureDefaultServletHandling方法中启用配置

WebMVCConfigureAdapter类已弃用,因此我们使用WebMVCConfiguer接口

@配置 @EnableWebMvc @组件扫描 公共类WebConfig实现WebMVCConfiguer{ @凌驾 公共无效配置ViewResolversViewResolverRegistry注册表{ registry.jsp/WEB-INF/views/,.jsp; } @凌驾 公共无效配置DefaultServletHandlingDefaultServletHandlerConfigurer配置器{ configurer.enable; } } 我使用gradle,您的应用程序在pom.xml中应该具有以下依赖项:

依赖关系{ 编译组:'org.springframework.boot',名称:'springbootstarterweb',版本:'2.3.0.RELEASE' 编译组:“org.apache.tomcat.embed”,名称:“tomcat嵌入jasper”,版本:“9.0.35” }
因此,问题可以简单到在项目路径中增加一个空间。确保路径中没有我花了很长时间才解决的空间。

在我的例子中,我创建了Config.java类和Config.xml,并在这两个类中部分地完成了映射。由于config.java使用@Configuration注释,因此它被认为是优先级。并且没有考虑config.xml。
如果有人遇到这样的麻烦,只需删除带有注释的config.java并尝试保留config.xml,它就可以正常工作。

对于@EnableWebMvc,dispatcherServlet,它已经注册到/。您可能希望将请求转发到路径为/WEB-INF/jsps/example-view-name.JSP的JSP资源。这不会发生。如何使其工作,以便将其转发到该路径上的JSP资源?这基本上就是要问的问题。@Tor就其本身而言,@Configuration注释类上的@EnableWebMvc不能做到这一点。它所做的只是向应用程序上下文添加一些默认的SpringMVC处理程序/适配器bean。注册DispatcherServlet以提供服务/是一个完全独立的过程,它以我在“其他常见错误”一节中描述的多种方式完成。我回答了你在下面引用的两段中提出的问题。
public class Application extends AbstractAnnotationConfigDispatcherServletInitializer {
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { };
    }
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { SpringServletConfig.class };
    }
    protected String[] getServletMappings() {
        return new String[] { "/*" };
    }
}
@Configuration
@ComponentScan("com.example.controllers")
@EnableWebMvc
public class SpringServletConfig {
    @Bean
    public InternalResourceViewResolver resolver() {
        InternalResourceViewResolver vr = new InternalResourceViewResolver();
        vr.setPrefix("/WEB-INF/jsps/");
        vr.setSuffix(".jsp");
        return vr;
    }
}
@Controller
public class ExampleController {
    @RequestMapping(path = "/home", method = RequestMethod.GET)
    public String example() {
        return "index";
    }
}
@Controller
public class ExampleController {
    @RequestMapping(path = "/example", method = RequestMethod.GET, headers = "X-Custom")
    public String example() {
        return "example-view-name";
    }
}
@RequestMapping(path = "/example", method = RequestMethod.GET)
public String example() {
    return "example-view-name";
}
@Bean
public InternalResourceViewResolver resolver() {
    InternalResourceViewResolver vr = new InternalResourceViewResolver();
    vr.setPrefix("/WEB-INF/jsps/");
    vr.setSuffix(".jsp");
    return vr;
}
@Controller
Class Controller{
@RequestMapping(value="/abc.html")//abc is the requesting page
public void method()
{.....}
}
@Bean
public InternalResourceViewResolver resolver() {
    InternalResourceViewResolver vr = new InternalResourceViewResolver();
    vr.setPrefix("/WEB-INF/jsps/");
    vr.setSuffix(".jsp");
    return vr;
}
<dependency>
       <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
       <scope>provided</scope>
</dependency>
<context:annotation-config />
<context:component-scan
    base-package="com.happy.app"></context:component-scan> 
@ComponentScan(basePackageClasses={WebController.class})
<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        com.lionheart.fourthed.config.WebConfig
    </param-value>
</init-param>
<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        com.lionheart.fourthed.config.MainConfig
    </param-value>
</init-param>