Spring MVC with Boot: "发生了意外错误(类型 =未找到,状态=404)"

IT小君   2023-10-24T23:22:49

所以我是新手使用Spring,到目前为止我已经成功运行了一个连接到MongoDB数据库的简单web API,但是我在使用.jsp或.html文件生成普通视图时遇到了问题。我尝试了多种不同的方法:InternalResourceViewResolverXmlViewResolver,返回字符串而不是ModelAndView对象等,但似乎都没有起作用。我有以下代码:

编辑:这是一个带有我的项目的git仓库: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目录从我的项目根目录移到<project root>/src/main/webapp/中,来成功加载视图。我只想知道,如果我的WEB-INF目录包含在另一个目录中,它是否仍将按预期运行(使其内容不直接可见)?

评论(10)
IT小君

Spring Boot对JSP的支持有限,这是因为它使用了内嵌的servlet容器。根据Spring Boot参考文档

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

如果使用war打包的话在Tomcat上应该可以工作,即可执行war将可工作,并且也可以部署到标准容器(包括但不限于Tomcat)。 由于Tomcat中有一个硬编码的文件模式,所以可执行的jar将不会工作。Jetty当前无法作为一个嵌入式容器与JSP一起工作。

这里是在Spring Boot应用程序中使用jsp的基本示例。

2023-10-24T23:23:13   回复
IT小君
希望您的类路径中有JSP库。如果您在使用maven,将以下依赖项包含在pom.xml中将拥有这些库: <!-- 用于使用JSP --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!-- 如果您想使用JSTL --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> 另外,您可能需要在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版本,但不适用于当前稳定版本。
2023-10-24T23:23:30   回复
IT小君

尝试以下内容:

 hello;

    导入 org.springframework.stereotype.Controller;
    导入 org.springframework.web.servlet.ModelAndView;
    导入 org.springframework.web.bind.annotation.RequestMapping;

    @Controller
    公共的  IndexController
    {
        @RequestMapping("/")
        公共的 String 索引()
        {
            回报 "索引";
        }
    }
2023-10-24T23:23:41   回复
IT小君

在升级一个旧的应用程序到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是我们resources/static目录下的一个子文件夹。

2023-10-24T23:23:54   回复
IT小君

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

2023-10-24T23:24:06   回复
IT小君

我在application.properties文件中添加了一行。

server.tomcat.additional-tld-skip-patterns=hk2-utils.jar,javax.annotation-api.jar,javax.inject.jar,hk2-api.jar,config-types.jar,hk2-core.jar,hk2-config.jar,tiger-types.jar,validation-api.jar,jboss-logging.jar,classmate.jar,hk2-locator.jar,javassist.jar,hk2-runlevel.jar,class-model.jar,asm-all-repackaged.jar

然后它应该可以运行。

2023-10-24T23:25:20   回复
IT小君

我已经使用mvn spring-boot:run

对我来说它起作用了

2023-10-24T23:25:24   回复
IT小君

尽管我已经尝试了许多方法来解决这个问题,但仍然找不到完美的解决方案。

如果您正在使用Intellij IDEA:请不要尝试使用IDE的运行按钮来运行带有动态.jsp视图的Spring Boot应用程序。

$ cd {PROJECT_FOLDER}

$ ls //确保您在pom.xml所在的同一文件夹中
然后运行以下命令

$ mvn spring-boot:run

现在您的应用程序应该在localhost:8080上提供服务。

2023-10-24T23:25:40   回复
IT小君

我曾面临着同样的问题,我的解决方案是将

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

spring.view.suffix: .jsp

替换成以下配置类。这个方法对我有效!

package com.rbc.sample.user.login.sample;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.UrlBasedViewResolver;


@Configuration
public class WebConfig {


    public static final String RESOLVER_PREFIX= "/WEB_INF/jsp/";
    public static final String RESOLVER_SUFIX=".jsp";


    @Bean
    public ViewResolver viewResolver(){
        UrlBasedViewResolver viewResolver=new InternalResourceViewResolver();
        viewResolver.setPrefix(RESOLVER_PREFIX);
        viewResolver.setSuffix(RESOLVER_SUFIX);

        return viewResolver;
    }
}
2023-10-24T23:26:26   回复