我正在尝试做教程 - > 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";
}
}
您可能在遵循本教程时跳过了一个步骤。
我会解释你为什么会得到你所看到的行为,然后你可以决定接着做什么。
你可能已经开始了你的应用了
SpringApplication.run(Application.class, args);
在教程Application
类'main
方法。默认情况下,由于@EnableAutoConfiguration
(以及类路径上的其他组件),将为您注册DispatcherServlet
,它提供了一个默认的UrlBasedViewResolver
,它不会将prefix
或suffix
设置为它所解析的视图。
在你的@Controller
处理程序方法中,当你这样做
return "greeting";
Spring将使用UrlBasedViewResolver
来解析视图名称。在这种情况下,视图名称将只是greeting
。在正常情况下,一旦完成,它将使用Servlet
API的HttpServletRequest#getRequestDispatcher(String)
传递该视图名称。该方法返回一个RequestDispatcher
,它指向该路径的处理程序。
在我们的例子中,在获取RequestDispatcher
之前,Spring将比较视图名称(解析为路径)和当前请求的路径。它会发现它们是平等的。换句话说,对/greeting
的请求将通过将视图返回到/greeting
来处理,该视图将由相同的@Controller
处理程序方法处理,并且这将永远存在。 Spring会检测到这一点并告诉您有一个圆形视图路径,即。你会无限循环。
了解@EnableAutoConfiguration
如何工作并更改您的配置,以便您可以定义自己的UrlBasedViewResolver
或InternalResourceViewResolver
,它们适当地设置前缀和后缀。
您可以在official Spring MVC documentation中阅读有关视图名称解析的更多信息。
检查.pom中的依赖项(如果有)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
public String greeting(){}
应写入public **@ResponseBody** String greeting(){}
,
因此,春天mvc不会返回视图,你的问题就会消失。
在这里,你正在击中/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";
}
}
我在遵循given教程时遇到了同样的错误。我的maven依赖项出错了,我可以通过删除.m2文件夹并再次安装依赖项来解决问题。