Spring MVC with Boot:“出现意外错误(type = Not Found,status = 404)”

所以我是Spring的新手,到目前为止我已经运行了一个连接到MongoDB数据库的简单Web API,但是我在使用.jsp或.html文件生成普通的旧视图时遇到了麻烦。 我尝试了各种不同的方法: InternalResourceViewResolverXmlViewResolver ,返回Strings而不是ModelAndView对象,似乎没有什么对我XmlViewResolver 。 我有以下代码:

编辑 :这是我的项目的一个git repo: https : //github.com/jwallp/Spring-Test

正如上面的项目所示,我在转到/index时遇到了白标错误:

 There was an unexpected error (type=Internal Server Error, status=500). Circular view path [index]: would dispatch back to the current handler URL [/index] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.) 

编辑 :所以我设法通过使用spring.view.prefixspring.view.suffix而不是spring.mvc.view.prefix等来获取最终加载的视图,并将我的WEB-INF目录从我的项目根目录移动到在/src/main/webapp/ 。 我只是想知道,如果我的WEB-INF目录包含在另一个目录中,它是否仍然按预期运行(使其内容不直接可见)?

Spring Boot对JSP的支持有限,因为它使用了嵌入式servlet容器。 从Spring Boot参考文档 :

运行使用嵌入式servlet容器的Spring Boot应用程序(并打包为可执行存档)时,JSP支持存在一些限制。

使用Tomcat它应该可以使用war包装,即可执行的war会起作用,并且也可以部署到标准容器(不限于但包括Tomcat)。 由于Tomcat中的硬编码文件模式,可执行jar将无法工作。 Jetty目前不能用作带JSP的嵌入式容器。

这是在spring boot应用程序中使用jsp的基本示例。

希望您的类路径中包含JSP库。 如果你正在使用maven,包括pom.xml的以下依赖项将具有:

    org.apache.tomcat.embed tomcat-embed-jasper provided    javax.servlet jstl  

此外,您可能需要将此行放在JSP文件的顶部:

 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> 

更新

在GitHub上对您的项目进行以下更改在我的环境中工作:

  1. 将WEB-INF文件夹移动到src/main/webapp 。 这就是它的地方。
  2. application.properties替换

     spring.mvc.view.prefix=/WEB-INF/pages/ spring.mvc.view.suffix=.jsp 

     spring.view.prefix: /WEB-INF/pages/ spring.view.suffix: .jsp 

    似乎前者将与Spring Boot 1.3一起使用 ,但不能与当前的稳定版本一起使用 。

尝试以下方法:

 package hello; import org.springframework.stereotype.Controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class IndexController { @RequestMapping("/") public String index() { return "index"; } } 

我们在将旧应用程序升级到Spring Boot时遇到了这个问题。 我们做了什么:

  1. 上面给出的application.properties的前缀和后缀映射(虽然我们的前缀只是/WEB-INF/ )。

  2. 将我们的CSS,JavaScript,HTML文件移动到resources \ static文件夹。 对于每种类型,我们都有子目录。

  3. 使用window.open("somefile.jsp")地方被更改为window.open("somevalue.do") ,其中somevalue映射到@RequestMapping值,而该方法的ModelAndViewsetViewName映射到前一个jsp 。 如果有window.open("somefile.html")我们将其更改为window.open("includes/somefile.html") ,其中includes是我们的资源/静态树中的子目录。

我几次遇到这个问题。 那是因为我把/ WEB-INF / in / src / main / java文件夹。 最新我在/ src / main / webapp中为INF文件创建了单独的路径,我能够正确运行我的应用程序并在浏览器中显示文本。

以下jsp文件重定位可以解决问题。 我这样解决了我的问题:

将.jsp文件移动到:

 "src/main/resources/META-INF/resources/WEB-INF/jsp". 

确保application.properties文件包含:

 spring.view.prefix: /WEB-INF/jsp/ spring.view.suffix: .jsp 

你的控制器类应该是这样的:

  @Controller public class IndexController { @RequestMapping("/") public String index() { return "index"; } } 

如果您使用的是maven,请在pom.xml中包含以下依赖项

   org.apache.tomcat.embed tomcat-embed-jasper provided    javax.servlet jstl  

它应该工作。