Spring MVC with Boot:“出现意外错误(type = Not Found,status = 404)”
所以我是Spring的新手,到目前为止我已经运行了一个连接到MongoDB数据库的简单Web API,但是我在使用.jsp或.html文件生成普通的旧视图时遇到了麻烦。 我尝试了各种不同的方法: InternalResourceViewResolver
, XmlViewResolver
,返回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.prefix
和spring.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上对您的项目进行以下更改在我的环境中工作:
- 将WEB-INF文件夹移动到
src/main/webapp
。 这就是它的地方。 -
在
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时遇到了这个问题。 我们做了什么:
-
上面给出的
application.properties
的前缀和后缀映射(虽然我们的前缀只是/WEB-INF/
)。 -
将我们的CSS,JavaScript,HTML文件移动到resources \ static文件夹。 对于每种类型,我们都有子目录。
-
使用
window.open("somefile.jsp")
地方被更改为window.open("somevalue.do")
,其中somevalue
映射到@RequestMapping
值,而该方法的ModelAndView
的setViewName
映射到前一个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
它应该工作。