我有一个使用Maven构建的使用Spring-MVC的Web应用程序。当我生成JAR文件时,应用程序启动正常。控制器已执行,但是当我到达此部分时:
@RequestMapping(value = "/test-block", method = RequestMethod.GET)
public ModelAndView block(Model model) {
return new ModelAndView("templates/test-block");
}
我收到此错误:
There was an unexpected error (type=Not Found, status=404).
/WEB-INF/templates/test-block.jsp
请注意,在IDE中调试或运行可以正常工作。
我的文件夹:
src
|--main
|--java
|--com.xxx // sources
webapp
|--WEB-INF
|--templates
|--*.jsp // jsp files
resources
|--application.properties
我的应用程序属性:
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp
我检查了生成的JAR文件,但在任何地方都看不到WEB-INF。
编辑:
pom文件:
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
答案 0 :(得分:2)
您应该为Web应用程序创建.war
而不是.jar
,然后您会看到WEB-INF
文件夹。
也要更改
spring.mvc.view.prefix=/WEB-INF/
至
spring.mvc.view.prefix=/WEB-INF/templates
和
ModelAndView("templates/test-block")
至ModelAndView("test-block")
以解决404错误。
答案 1 :(得分:0)
Spring Boot查找网页的资源文件夹。 Webapp文件夹不在Spring Boot应用程序的类路径中。您需要使用Maven插件将webapp文件夹复制到jar / war文件中。 它可以在IDE中工作,因为您可以确切地知道在哪里可以找到网页。
答案 2 :(得分:0)
参考serving static content上的Spring Boot文档。
值得注意的是:
默认情况下,Spring Boot从名为的目录中提供静态内容 / static(或/ public或/ resources或/ META-INF / resources)中的 classpath或从ServletContext的根开始。它使用 Spring MVC的ResourceHttpRequestHandler,以便您可以修改它 通过添加自己的WebMvcConfigurer并覆盖 addResourceHandlers方法。
...
您还可以使用以下选项来自定义静态资源位置: spring.resources.static-locations属性(替换默认属性) 值以及目录位置列表。
...
如果您的应用程序是,请不要使用src / main / webapp目录 包装为罐子。尽管此目录是通用标准,但它 仅适用于战争包装,大多数人默默忽略 如果生成jar,则构建工具。
因此,您看到的是预期的行为。您可以将模板移至预期位置之一,自定义默认位置,也可以使用战争包装。