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

时间:2015-08-09 02:46:47

标签: java spring spring-mvc spring-boot

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

修改:这是我项目的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内的{1}}目录。我只是想知道,如果我的<project root>/src/main/webapp/目录包含在另一个目录中,它是否仍然按预期运行(使其内容不直接可见)?

10 个答案:

答案 0 :(得分:4)

Spring Boot对JSP的支持有限,因为它使用了嵌入式servlet容器。来自Spring Boot reference documentation

  

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

     

使用Tomcat,如果你使用战争包装,它应该可以工作   可执行的战争将起作用,并且也可以部署到标准   容器(不限于,但包括Tomcat)。一个可执行的jar   因为Tomcat中的硬编码文件模式而无法工作。码头   目前不能用作带JSP的嵌入式容器。

Here是在spring启动应用程序中使用jsp的基本示例。

答案 1 :(得分:3)

希望您的类路径中包含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,但不适用于current stable release

答案 2 :(得分:0)

尝试以下内容:

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

答案 3 :(得分:0)

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

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

  2. 将CSS,JavaScript,HTML文件移至resources \ static文件夹。我们为每种类型都有子目录。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

然后它将运行。

答案 6 :(得分:0)

我用过mvn spring-boot:run

对我有用

答案 7 :(得分:0)

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

如果您使用的是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上提供。

答案 8 :(得分:0)

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

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

答案 9 :(得分:-1)

遵循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>

然后它应该工作。