Spring MVC 和 Maven 集成

Posted

技术标签:

【中文标题】Spring MVC 和 Maven 集成【英文标题】:Spring MVC & Maven Integration 【发布时间】:2013-12-26 08:30:33 【问题描述】:

我正在尝试构建一个 Spring MVC 项目,但在尝试解决以下错误时遇到了一些麻烦。

HTTP 状态 500 - 循环视图路径 [登录]:将调度回 再次访问当前处理程序 URL [/login]。检查您的 ViewResolver 设置! (提示:这可能是未指定视图的结果,由于默认 查看名称生成。)

我通过终端输入了以下命令:

mvn 清洁包 java -jar 目标/sprint2-0.1.0.jar

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.teamvirus.src</groupId>
    <artifactId>sprint2</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>0.5.0.M6</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--><dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring3</artifactId>
        </dependency>-->

    </dependencies>

    <properties>
        <start-class>com.teamvirus.src.Application</start-class>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestone</id>
            <url>http://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-milestone</id>
            <url>http://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

</project>

LoginController.java

package com.teamvirus.src;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class LoginController 
    @RequestMapping("/login")
    public String login() 
        return "login";
    

    @RequestMapping("/authenticate")
    public String authenticate(
            @RequestParam(value = "username", required = true) String username,
            @RequestParam(value = "password", required = true) String password) 
        if ((username.equals("admin") && password.equals("admin")))
            return "redirect:dashboard?username=" + username;
        else if ((username.equals("student1") && password.equals("student1"))) 
            return "redirect:dashboard?username=" + username;
        
        return "wrongpassword";
    

感谢您提供的任何帮助。

编辑:

Application.java

package com.teamvirus.src;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan
@EnableAutoConfiguration
public class Application 
    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

【问题讨论】:

发布一些配置。 您好 M. Deinum,我不确定您所说的配置是什么意思。如果您能澄清一下,不胜感激。 我假设你有一个@Configuration class/classes somewhre。发布它们。 我在项目中看到的唯一配置是Application.java。我已经编辑了上面的帖子以包含它。 【参考方案1】:

您完全依赖 Spring Boot 来配置所有内容,尽管这对于您当前的视图来说应该不是问题。

默认情况下,Spring boot 注册一个InternalResourceViewResolver,但是没有任何前缀/后缀。 (见source)。假设您在 /WEB-INF/views 中有您的意见并且它们是 jsp 文件,请执行以下操作

    src\main\resources 添加application.properties 文件 添加属性spring.view.prefix,其值为/WEB-INF/views/ 添加属性spring.view.suffix,其值为“.jsp”

重新打包并启动您的应用程序。

如果您没有此附加配置,/login 将返回到 /login,这将返回到 /login,这将返回到 /login,这将......好吧,我猜你明白了. (login 是您在 @Controller 中引用的视图的名称。

【讨论】:

谢谢。我已按照您的建议和application.properties 文件使用以下内容:@Value("$spring.view.prefix:") private String prefix = "/WEB-INF/views/"; @Value("$spring.view.suffix:") private String prefix = ".jsp"; 重新打包,并重新启动了我的应用程序,但仍然出现与之前相同的错误。我这样做对吗? 为什么将它添加到属性文件中?那是java不是普通的属性。你应该有类似spring.view.prefix=/WEB-INF/views/ 的东西,而不是你添加的东西。 抱歉,我还在学习中。这似乎解决了圆形视图路径错误消息。但是,即使在清理、打包和运行之后,我的 JSP 文件也没有显示。 见***.com/questions/20199609/…。您可能还想查看示例应用程序。要更深入地了解正在发生的事情,请启用调试/跟踪日志记录并查看当您的页面被解析时会发生什么。 感谢您的帮助。我很感激。我会阅读并调查此事。我已将您的帖子标记为已接受的答案。【参考方案2】:

你有视图解析器吗? 尝试添加

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

因此,当您返回 "login" 时,它将搜索并加载 /WEB-INF/pages/ 内名称为 login.jsp 的 jsp。如果没有视图解析器,它将再次调用您的控制器方法。

【讨论】:

我在 servlet-context.xml 中有以下内容。我的页面在“视图”中。 你的servlet-context.xml 不会被读取,所以基本上所有的配置都会被忽略。将其移至 java 配置或查看 Spring Boot 已为您提供的内容并进行相应配置。

以上是关于Spring MVC 和 Maven 集成的主要内容,如果未能解决你的问题,请参考以下文章

Spring-mvc 与 reactjs 的集成?

为啥 Spring MVC 4 和 Hystrix 集成在没有 Spring boot API 的情况下无法工作?

使用maven简单搭建springmvc

Mybatis系列六:与Spring MVC的集成

与 Spring MVC 的 HTML 集成

话编程 | 传统 Spring MVC 项目 集成 Prometheus