循环视图路径错误,Spring MVC

问题描述 投票:4回答:5

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

当我运行它,它说圆形视图路径[问候],为什么?

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

return "greeting";

代码段:

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
5个回答
4
投票

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

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

你可能已经开始了你的应用了

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中阅读有关视图名称解析的更多信息。


9
投票

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

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

2
投票

public String greeting(){}应写入public **@ResponseBody** String greeting(){}, 因此,春天mvc不会返回视图,你的问题就会消失。


0
投票

在这里,你正在击中/greeting controllew,它返回一个字符串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";
    }
}

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.