圆形视图路径错误Spring启动

时间:2016-04-18 15:00:37

标签: java spring spring-mvc spring-boot

我是Spring的新手。我正在尝试使用Spring Boot构建一个MVC应用程序,它显示了一个产品列表。但我得到以下错误:

  

javax.servlet.ServletException:循环视图路径[products]:会        再次发送回当前处理程序URL [/ products]。检查你的        ViewResolver设置! (提示:这可能是未指明的结果        视图,由于默认视图名称生成。)

这是控制器:

package com.springframeworkguru.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.springframeworkguru.services.ProductService;


    @Controller
    public class ProductController {

        private ProductService productService;

        @Autowired
        public void setProductService(ProductService productService) {
            this.productService = productService;
        }

        @RequestMapping("/products")
        public String listProducts(Model model){

            model.addAttribute("products", productService.listAllProducts());

            return "products";
        }

    }

这是主要课程:

package com.springframeworkguru;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

import com.springframeworkguru.controllers.ProductController;

@SpringBootApplication
public class SpringmvcApplication extends SpringBootServletInitializer{

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

products.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Spring Core Online Tutorial - List Products</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

    <link href="http://cdn.jsdelivr.net/webjars/bootstrap/3.3.4/css/bootstrap.min.css"
          th:href="@{/webjars/bootstrap/3.3.5/css/bootstrap.min.css}"
          rel="stylesheet" media="screen"/>

    <script src="http://cdn.jsdelivr.net/webjars/jquery/2.1.4/jquery.min.js"
            th:src="@{/webjars/jquery/2.1.4/jquery.min.js}"></script>

    <link href="../css/spring-core.css"
          th:href="@{css/spring-core.css}" rel="stylesheet" media="screen"/>
</head>
<body>
<div class="container">
    <div th:if="${not #lists.isEmpty(products)}">
        <h2>Product List</h2>
        <table class="table table-striped">
            <tr>
                <th>Id</th>
                <th>Description</th>
                <th>Price</th>
                <th>Image URL</th>
                <th>List</th>
            </tr>
            <tr th:each="product : ${products}">
                <td th:text="${product.id}"></td>
                <td th:text="${product.description}"></td>
                <td th:text="${product.price}"></td>
                <td th:text="${product.imageUrl}"></td>
                <td><a th:href="${'/product/' + product.id}">View</a> </td>
            </tr>
        </table>
    </div>
</div>

</body>
</html>

products.html位于/static文件夹中。另外,我正在使用Eclipse Kepler。

11 个答案:

答案 0 :(得分:77)

添加spring-boot-starter-thymeleaf依赖项解决了这个问题。

所以将它添加到你的pom.xml文件中:

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

答案 1 :(得分:13)

  

products.html是/ static文件夹

默认情况下,Spring Boot会在类路径的templates目录中查找Thymeleaf模板。因此,请将products.html移至src/main/resources/templates目录。您可以在Spring Boot Documentation

上阅读有关模板引擎和Spring Boot的更多信息
  

当您使用默认的百里叶模板引擎时   配置,您的模板将自动从中获取   src/main/resources/templates

此外,static目录是放置静态内容的地方,而不是模板。

答案 2 :(得分:11)

pom.xml

中添加以下依赖项
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>1.4.0.RELEASE</version>
</dependency>

最新版本可在mvnrepository

找到

答案 3 :(得分:3)

默认情况下,Spring Boot使用InternalResourceView类作为视图解析器。如果@GetMapping的值与视图名称相同,则请求失败,并出现循环视图路径错误。

一种解决方案是不要对URL路径和视图名称使用相同的名称。

如果我们选择Thymeleaf处理器,则不会出现错误。

我有一个使用Freemarker的示例,并且有圆形视图路径错误(Spring Boot 2.2.4)。我必须重命名URL路径。

答案 4 :(得分:1)

使用嵌入式servlet容器(嵌入式tomcat)可能会引起问题。 @mirmdasif answer

要解决此问题,请使用外部tomcat服务器。

在STS / Eclipse中配置tomcat服务器:
1.从顶部菜单:Window > Show View > Servers
2.在“服务器”选项卡窗口的上下文菜单中:New > Server
3.将项目配置为deploy WAR file to Tomcat
4.以Spring Boot App

运行项目

将WAR文件部署到Tomcat
主类应该扩展SpringBootServletInitializer并重写SpringApplicationBuilder方法...

package package_with_your_main_class;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class YourStartWebApplication extends SpringBootServletInitializer {

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(YourStartWebApplication.class);
    }
}

pom.xml应该包含

<!-- Parent pom providing dependency and plugin management for applications -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <!-- this version works with tomcat 8.5, change to newest if you are using newer tomcat -->
    <version>2.0.9.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <java.version>1.8</java.version>
    <!-- The main class to start by executing java -jar -->
    <start-class>package_with_your_main_class.SpringBootWebApplication</start-class>
</properties>

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

    <!-- templating language -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId> 
    </dependency>

    <!-- marked the embedded servlet container as provided -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>

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

<packaging>war</packaging>

答案 5 :(得分:1)

@Controller转换为@RestController,这将解决循环路径问题。

答案 6 :(得分:0)

您之所以在这里是因为您忘记将rest控制器的 @RestController 放在该类上了:)

答案 7 :(得分:0)

好吧,我在使用SpringBoot时遇到了同样的问题,而我所做的就是替换 @Controller与@RestController一起使用,效果很好。

答案 8 :(得分:0)

确保在春季启用了百里香 在application.properties中:

  

spring.thymeleaf.enabled = true

答案 9 :(得分:0)

在我的情况下,spring boot 2 和 jdk 11 中的圆形视图路径是通过重定向到 index.html 来修复的:

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            }
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/").setViewName("redirect:/index.html");
            }
        };

答案 10 :(得分:-1)

将“product.ftl”重命名为“product s .ftl”。