找不到带URI的HTTP请求的映射(spring 4.1 annotation配置) [英] No mapping found for HTTP request with URI (spring 4.1 annotation configuration)

查看:352
本文介绍了找不到带URI的HTTP请求的映射(spring 4.1 annotation配置)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,请不要锁定这个帖子。我已经阅读了所有问题,但它们仍然无法解决我的问题。

我正在研究如何在没有配置xml文件的情况下在spring上使用注释。

我一直在坚持错误:

first of all, please don't lock this thread, please. I've read all the questions, and they still cannot solve my problem.
I'm studying how to use annotation on spring without configuring xml files.
I'm stucking with the error:


在$ b $中找不到带有URI [/WEB-INF/index.jsp]的HTTP请求的映射b名称为dispatcherServlet的DispatcherServlet

No mapping found for HTTP request with URI [/WEB-INF/index.jsp] in DispatcherServlet with name 'dispatcherServlet'



这是项目结构



This is the project structure



这是我的pom.xml


This my 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>com.mycompany</groupId>
    <artifactId>spring-sample</artifactId>
    <version>1.0</version>
    <packaging>war</packaging>

    <name>spring-sample</name>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.0.M2</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>http://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </pluginRepository>
    </pluginRepositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

这是配置类:

@ComponentScan(basePackages = "com.sample.spring")
@EnableAutoConfiguration
@EnableWebMvc
@org.springframework.context.annotation.Configuration
public class MainApp extends WebMvcConfigurerAdapter implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {

        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext
                = new AnnotationConfigWebApplicationContext();
        rootContext.register(MainApp.class);

        // Manage the lifecycle of the root application context
        sc.addListener(new ContextLoaderListener(rootContext));

        ServletRegistration.Dynamic registration = sc.addServlet("dispatcher", new DispatcherServlet());
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
    }

    @Bean
    public ViewResolver configureViewResolver() {
        InternalResourceViewResolver viewResolve = new InternalResourceViewResolver();
        viewResolve.setPrefix("/WEB-INF/");
        viewResolve.setSuffix(".jsp");

        return viewResolve;
    }

    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        return new RequestMappingHandlerMapping();
    }

    @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
        return new RequestMappingHandlerAdapter();
    }

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

这是控制器:

@org.springframework.stereotype.Controller
public class Controller {

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

}

index.jsp在WEB-内INF文件夹,web.xml文件中没有任何内容。

我认为到目前为止配置是正确的,因为它可以重定向到/WEB-INF/index.jsp。
但是,我认为我缺少一些配置来让应用程序理解路径。 (/WEB-INF/index.jsp)

index.jsp is inside WEB-INF folders, and there is nothing inside web.xml file.
I think so far the configuration is correct because it can redirect to /WEB-INF/index.jsp. However, I think that I'm missing some configuration to make the application to understand the path. (/WEB-INF/index.jsp)

推荐答案

鉴于您使用的是Spring Boot,您的配置要复杂得多比它需要的。 Boot将自动配置 DispatcherServlet ViewResolver RequestMappingHandlerMapping ,和 RequestMappingHandlerAdapter

Given that you're using Spring Boot, your configuration is far more complicated than it needs to be. Boot will automatically configure the DispatcherServlet, ViewResolver, RequestMappingHandlerMapping, and RequestMappingHandlerAdapter for you.

看看 Spring Boot的JSP示例,看看你需要多少配置。

Take a look at Spring Boot's JSP sample to see how little configuration you need.

除了删除几乎所有的手动配置之外,一个关键的区别是你的主应用程序类应该扩展 SpringBootServletInitializer 而不是实现Spring的 WebApplicationInitializer 直接。这是上述示例中的等价类:

In addition to removing pretty much all of the manual configuration, one key difference is that your main application class should extend SpringBootServletInitializer rather than implementing Spring's WebApplicationInitializer directly. Here's the equivalent class in the aforementioned sample:

package sample.jsp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class SampleWebJspApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SampleWebJspApplication.class);
    }

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

}

使用 java -jar configure 方法启动war文件时使用main 方法将war部署到单独的Servlet容器时使用。

The main method is used when launched the war file using java -jar and the configure method is used when the war is deployed to a separate Servlet container.

另请注意 sample使用application.properties 配置视图前缀和后缀。

Also note the sample's use of application.properties to configure the view prefix and suffix.

这篇关于找不到带URI的HTTP请求的映射(spring 4.1 annotation配置)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆