【问题标题】:No mapping found for HTTP request with URI [/WEB-INF/pages/MainPage.jsp] in DispatcherServlet with name 'dispatcherServlet' [duplicate]在名称为“dispatcherServlet”的 DispatcherServlet 中找不到具有 URI [/WEB-INF/pages/MainPage.jsp] 的 HTTP 请求的映射 [重复]
【发布时间】:2015-02-18 10:39:00
【问题描述】:

我正在尝试使用注释配置 Spring Boot。 我有课

@EnableWebMvc
@Configuration
@ComponentScan({
    ...
})
@EnableTransactionManagement
@EnableAutoConfiguration
@Import({ SecurityConfig.class })
public class AppConfig extends SpringBootServletInitializer {...}

其中包含工作正常的视图解析器。

@Bean
public InternalResourceViewResolver internalViewResolver() {
    InternalResourceViewResolver viewResolver
            = new InternalResourceViewResolver();
    viewResolver.setViewClass(JstlView.class);
    viewResolver.setPrefix("/WEB-INF/pages/");
    viewResolver.setSuffix(".jsp");
    viewResolver.setOrder(1);
    return viewResolver;
}

但是在收到 JSP 文件应用程序的名称后会引发此错误: 在名称为“dispatcherServlet”的 DispatcherServlet 中找不到带有 URI [/WEB-INF/pages/MainPage.jsp] 的 HTTP 请求的映射。

我找到了 XML 配置的解决方案:

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping> 

但是我使用的是注解配置,所以这个灵魂不适合我。

我试图通过扩展 AbstractAnnotationConfigDispatcherServletInitializer 来解决这个问题

public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { AppConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    //  I thought this method will be equivalent to XML config solution described above
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

但此后一切都没有改变。顺便说一句,我用 AbstractAnnotationConfigDispatcherServletInitializer 查看了几个示例,但我仍然不明白应用程序在没有注释并且没有创建此类实例的情况下如何使用此类。它刚刚宣布,仅此而已。也许我需要创建这个类的一个实例并将它附加到任何地方?

无论如何我在日志中看到这一行:Mapping servlet: 'dispatcherServlet' to [/] 所以看起来我有正确的 servlet 配置。

我尝试了this solution,但没有帮助。我删除了 InternalResourceViewResolver 并创建了具有此类内容的 application.properties:

spring.view.prefix: /WEB-INF/jsp/
spring.view.suffix: .jsp

但在那之后我收到:javax.servlet.ServletException: Could not resolve view with name 'MainPage' in servlet with name 'dispatcherServlet'

那么解决这个问题的正确方法是什么?

更新 我尝试从头开始创建一个新的简单项目。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>edu.springtest</groupId>
    <artifactId>SpringTest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.0.RELEASE</version>
        <relativePath/>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

Main.java

@Controller
@Configuration
@ComponentScan
@EnableAutoConfiguration
@SpringBootApplication
public class Main {
    @RequestMapping("/")
    String home() {
        return "hello";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Main.class, args);
    }
}

application.properties

spring.view.prefix: /WEB-INF/jsp/
spring.view.suffix: .jsp

项目结构:

我使用命令 mvn spring-boot:run 运行项目并接收 edu.test.Main:在 2.365 秒内启动 Main(JVM 运行 5.476) 在输出中。 但是当我打开 localhost:8080 我收到:

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sat Dec 20 11:25:29 EET 2014
There was an unexpected error (type=Not Found, status=404).
No message available

但现在我在输出中没有收到“未找到映射...”错误。当我打开 localhost:8080 时,根本不会打印任何内容。 那我做错了什么?

【问题讨论】:

  • 一方面我看到/WEB-INF/jsp,另一方面:/WEB-INF/pages
  • 是的,这是一个错误。但我更正了它,但它仍然无法正常工作:javax.servlet.ServletException:无法在名称为“dispatcherServlet”的 servlet 中解析名称为“MainPage”的视图
  • 战争包对我有用。见stackoverflow.com/questions/22121918/…

标签: java jsp spring-mvc spring-boot spring-annotations


【解决方案1】:
  • 您是否检查过 MainPage.jsp 是否存在于 WEB-INF/pages/ 文件夹中。
  • 更改公共类 AppConfig 扩展 WebMvcConfigurerAdapter

将 Bean 更改为:

 @Bean
 public ViewResolver getInternalResourceViewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/pages/"); 
    resolver.setSuffix(".jsp");
    return resolver;
 }

希望对你有帮助

【讨论】:

【解决方案2】:

摆脱您的自定义视图解析器并设置应用程序属性是正确的开始。 Spring Boot 的全部意义在于它可以很好地为您连接这些东西! :)

您应该有一个带有请求映射的控制器。比如:

@RequestMapping("/")
public String mainPage() {
    return "MainPage";
}

...它将使用您的MainPage.jsp 模板来处理对/ 的任何请求。

但是,值得注意的是,默认情况下,src/main/webapp 的内容不会内置到可执行应用程序 jar 中。要对付他,我知道有几种选择。

选项 1 - 将所有内容从 /src/main/webapp/ 移动到 src/main/resources/static。我认为这也适用于 JSP。这里唯一的问题是除非您在 IDE 中运行应用程序,否则您可以热替换代码。

选项 2 - 另一种方法(我倾向于使用)是设置我的 Maven 构建,以便在构建时将 src/main/webapp 的内容复制到类路径 static 文件夹中。

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${basedir}/target/classes/static</outputDirectory>
                <resources>
                    <resource>
                        <directory>src/main/webapp</directory>
                        <filtering>true</filtering>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

为了进一步阅读(虽然这看起来有点像你已经在做的),有一个示例项目,展示了一个使用 JSP 进行模板的 Spring Boot 应用程序:

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-web-jsp/

【讨论】:

  • 这正是我正在做的。我的控制器返回“MainPage”,然后 ViewResolver 将其转换为“/WEB-INF/pages/MainPage.jsp”,然后我收到:No mapping found for HTTP request with URI [/WEB-INF/pages/MainPage.jsp] in名称为“dispatcherServlet”的 DispatcherServlet。但是,当我删除视图解析器并添加 application.properties 时,我收到:无法在名称为“dispatcherServlet”的 servlet 中解析名称为“MainPage”的视图。所以看起来 application.properties 文件被忽略了。也许把它放在资源目录中是不够的,我需要在某个地方写它的路径?
  • 我认为从您的项目的根目录中,JSP 位于 src/main/webapp/WEB-INF/jsp/MainPage.jsp?
  • 另外......你是如何运行应用程序的?我只是想到问题可能在于您将 JSP 放入src/main/webapp。默认情况下,它不会内置到可执行 jar 中。
  • 我正在从 IntelliJ IDEA 运行我的应用程序。我尝试像应用程序一样运行它并使用 mvn spring-boot: run。是的,“src/main/webapp/WEB-INF/jsp/MainPage.jsp”就是我的MainPage.jsp的路径。您提供的选项也无济于事。我更新了我的问题。也许现在发现问题会更容易。
【解决方案3】:

我有同样的问题,但我还没有解决它,但可以提供更多信息以供您调查

通过跟踪tomcat-embed-core.jar中CachedResource的源代码,我发现如果你从开发环境运行应用程序,例如Eclipse,资源路径将指向项目目录,如下所示:

"C:/MyProject/MyApplication/src/main/webapp/WEB-INF/views/jsp/index.jsp"

其中必须包含此资源,但是当我使用“java -jar ...”命令从服务器运行它时,资源路径将设置为临时文件夹,例如:

"/tmp/tomcat-docbase.3976292633605332325.8080/WEB-INF/views/jsp/index.jsp"

但是 /tmp/tomcat-docbase.3976292633605332325.8080 是空的。但是我不知道如何设置资源路径,但以上两个都显示 InternalResourceViewResolver 只会处理来自物理目录的资源,而不是来自类路径的资源。如何设置 ResourceHandler 并不重要。

我有这个

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
    registry.addResourceHandler("/WEB-INF/**").addResourceLocations("classpath:/WEB-INF/");
}

并将所有资源打包到包中,静态资源是find,但是jsp资源一直说404。

【讨论】:

    【解决方案4】:

    对我来说,解决方案在 Intellij IDEA 中。

    在我的 tomcat 服务器配置中,在部署选项卡下,我缺少预期的应用程序上下文条目。例如。 /我的根

    希望对某人有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2013-11-19
      • 1970-01-01
      • 2016-07-02
      • 2013-09-12
      • 2016-04-01
      相关资源
      最近更新 更多