繁体   English   中英

Spring MVC with Boot:“出现意外错误(类型=未找到,状态=404)”

[英]Spring MVC with Boot: "There was an unexpected error (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目录从我的项目根目录移动到在<project root>/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包含以下依赖项将具有这些:

    <!-- For using JSP -->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>

    <!-- If you want to use 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 ,但不适用于当前的稳定版本

尝试以下操作:

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") ,其中包含是我们资源/静态树中的子目录。

我几次遇到这个问题。 这是因为我将 /WEB-INF/ 放在 /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 中包含以下依赖项

<!-- For using JSP -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

<!-- If you want to use JSTL -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

然后它应该工作。

我在 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

然后它应该运行。

我用过mvn spring-boot:run

它对我有用

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

如果您使用 Intellij IDEA:不要尝试使用 IDE 的运行 ▶︎ 按钮运行 Spring Boot 应用程序(使用动态 .jsp 视图)。

$ cd {PROJECT_FOLDER}

$ ls //Make sure that you are in the same folder where pom.xml resides
and then run below command

$ mvn spring-boot:run

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

我遇到了同样的问题,我的解决方案是更换

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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM