【问题标题】:Circular View Path Error, Spring MVC圆形视图路径错误,Spring MVC
【发布时间】:2013-11-01 18:22:01
【问题描述】:

我正在尝试做教程 -> http://spring.io/guides/gs/serving-web-content/

当我运行它时,它显示 Circular View Path[greeting],为什么?

在本教程中,我不明白的一件事是以下内容及其工作原理:

return "greeting";

代码sn-p:

package hello;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class GreetingController {
    @RequestMapping("/greeting")
    public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
        model.addAttribute("name", name);
        return "greeting";
    }
}

【问题讨论】:

标签: java spring spring-mvc view


【解决方案1】:

检查 .pom 中的依赖项(如果有)

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

【讨论】:

  • 添加这个依赖解决了我的圆形视图路径错误
【解决方案2】:

您在学习本教程时可能跳过了一个步骤。

我会解释为什么你会看到你看到的行为,然后你可以决定做什么。

你可能启动了你的应用程序

SpringApplication.run(Application.class, args);

教程中的Application类'main方法。默认情况下,由于@EnableAutoConfiguration(和类路径上的其他组件),将为您注册一个DispatcherServlet,它提供一个默认UrlBasedViewResolver,它不会为其视图设置prefixsuffix解决。

在您的 @Controller 处理程序方法中,当您这样做时

return "greeting";

Spring 将使用UrlBasedViewResolver 来解析视图名称。在这种情况下,视图名称将只是greeting。在正常情况下,一旦完成,它将使用Servlet API 的HttpServletRequest#getRequestDispatcher(String) 传递该视图名称。该方法返回一个RequestDispatcher,它指向该路径的处理程序。

在我们的例子中,在获取RequestDispatcher 之前,Spring 将比较视图名称(解析为路径)和当前请求的路径。它会发现它们都是相等的。换句话说,对/greeting 的请求将通过将视图返回到/greeting 来处理,该视图将由相同的@Controller 处理程序方法处理,并且永远如此。 Spring 检测到这一点并告诉您您有一个圆形视图路径,即。你会无限循环。

了解@EnableAutoConfiguration 的工作原理并更改您的配置,以便您可以定义自己的UrlBasedViewResolverInternalResourceViewResolver,从而适当地设置前缀和后缀。


您可以在official Spring MVC documentation 中阅读有关视图名称解析的更多信息。

【讨论】:

  • Hey Sotirios,如果我通过运行“SpringApplication.run(Application.class, args);”来启动应用程序有什么不同吗?并通过生成 .war 并运行 java -jar app.war?我问是因为我遇到了同样的错误,但它只发生在我从 IDE 运行应用程序时,如果我从 war 文件运行它就可以正常工作。
  • @GlauberNéspoli 唯一的潜在区别是您的类路径。检查您是否在 IDE 中正确设置了运行时类路径(即匹配您的 -jar 大小写)。
【解决方案3】:

public String greeting(){} 应该写到public **@ResponseBody** String greeting(){},
因此 spring mvc 不会返回视图,您的问题就会消失。

【讨论】:

  • 这解决了我的问题。虽然我的方法必须有比public @ResponseBody String greeting(){} 更多的参数。不知道为什么这个答案被否决了。将@ResponseBody 添加到我已经拥有的内容(并提供返回类型字符串)解决了我的问题。
  • @CodeMed 它可能被否决了,因为它违背了教程和问题的预期行为。返回值 "greeting" 旨在作为 Thymeleaf 视图的视图名称。如果他们使用@ResponseBody 注释该方法,则"greeting" 在响应正文中按字面意思返回。这不是他们想要的。
  • @SotiriosDelimanolis 感谢您的澄清。我认为大多数人通过谷歌搜索错误消息来找到这些帖子。我想发现这个的 mosr 人不会使用 Thymeleaf。有点有趣的是,对于 OP 的一个糟糕的答案正是一些未来的谷歌员工所需要的。
【解决方案4】:

在这里,您正在点击/greeting 控件,它返回一个字符串greeting。 但是 Spring 的视图解析器实际上试图做的是重定向到一个名为 greeting 的视图,这在此处不可用。因此,您只需在方法中添加 @ResponseBody 即可解决您的问题。

@Controller
public class GreetingController {
    @RequestMapping("/greeting")
    public @ResponseBody String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
        model.addAttribute("name", name);
        return "greeting";
    }
}

【讨论】:

    【解决方案5】:

    我在学习given 教程时遇到了同样的错误。 我的 maven 依赖项出现错误,我可以通过删除 .m2 文件夹并再次安装依赖项来解决问题。

    【讨论】:

      【解决方案6】:

      When Spring Boot application running by Intelij Idea views can`t be resolved

      添加

      <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
      <scope>compile</scope>
      </dependency>
      

      在没有其他方法的情况下为我做了这个伎俩。

      【讨论】:

        猜你喜欢
        • 2020-12-25
        • 2012-05-20
        • 2016-06-28
        • 1970-01-01
        • 2019-12-05
        • 2018-07-20
        • 2017-09-12
        • 2013-09-19
        • 2019-01-21
        相关资源
        最近更新 更多