2016-09-20 31 views
-1

我編寫了一個REST API作爲Spring Boot應用程序,在我開始工作之後,嘗試添加一個Web前端,從基本的「Hello World」類型索引頁面開始。嘗試打主頁一貫導致以下消息:Spring MVC在呈現頁面時忽略servlet配置

沒有找到映射與URI [/WEB-INF/index.jsp在DispatcherServlet的名爲「的DispatcherServlet」

HTTP請求這裏是控制器(我已經驗證正在通過斷點命中):

@Controller 
public class HomeController { 

    @RequestMapping(value = "/") 
    public String index() { 
     return "index"; 
    } 

} 

這裏與視圖解析器,這似乎並基於該消息被合併的主要應用:

@Configuration 
@EnableWebMvc 
@EnableJpaRepositories("com.name.api.repositories") 
@ComponentScan(basePackages = { 
     "com.name.api.controllers", 
     }) 
@EntityScan("com.name.api.entities") 
@SpringBootApplication 
public class RestApiApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(RestApiApplication.class, args); 
    } 

    @Bean 
    public ViewResolver internalResourceViewResolver() { 
     InternalResourceViewResolver bean = new InternalResourceViewResolver(); 
     bean.setViewClass(JstlView.class); 
     bean.setPrefix("/WEB-INF/"); 
     bean.setSuffix(".jsp"); 
     return bean; 
    } 
} 

這裏是我的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

    <servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet> 
    <servlet-name>jsp</servlet-name> 
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>jsp</servlet-name> 
    <url-pattern>/WEB-INF/views/*</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>jsp</servlet-name> 
    <url-pattern>/WEB-INF/*</url-pattern> 
</servlet-mapping> 
</web-app> 

正如你所看到的,該消息中的名稱始終是「DispatcherServlet的」,即使我重新命名上面的servlet這是不變的。

我也有一個dispatcher-servlet.xml,我懷疑它正在被使用。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 
<mvc:default-servlet-handler></mvc:default-servlet-handler> 
</beans> 

有一個index.html文件,以及一個index.jsp的一個下面的WebContent/WEB-INF /(當我加入了動態網頁面到我的項目創建的文件夾)。它始終無法找到它們,即使我將WEB-INF複製到與WebContent相同級別的自己的文件夾中,而不是它下面(或者如果在src/main/webapp /下複製了WEB-INF)。我已經介紹了一個調試器,並發現當它找不到處理程序映射時會打印該消息,但是當servlet的名稱與內容不匹配時,我懷疑它太深入到基本內容中配置(甚至故意將不正確的xml添加到文件中並沒有什麼區別,儘管這可能只是編譯器在識別錯誤​​後不會用好的代碼替換不好的代碼)。將相同的<load-on-startup>標記添加到「jsp」servlet中也不會執行任何操作。

這似乎是一個相當基本的錯誤,我確信有人問過它並回答了這個問題,但我在這裏經歷了很多類似的問題,但似乎沒有任何解決方案可行。

回答

0

我的首選是使用spring bean XML配置文件而不是基於Java的配置,所以我的解釋是使用我的首選選項。你可以在之後進行必要的「翻譯」。

我相信你錯過了一些配置:

  1. 當裝載調度的servlet的第一次,它會尋找一個Spring bean配置文件名:dispatcher-servlet.xml,如果你的dispatcher-servlet.xml不在預期的/WEB-INF/下,那麼你應該配置它。比方說,例如,它的/WEB-INF/spring/dispatcher-servlet.xml下找到,然後在web.xml你應該這樣:

    <servlet> 
        <servlet-name>dispatcher</servlet-name> 
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
        <init-param> 
         <param-name>contextLocation</param-name> 
         <param-value>/WEB-INF/spring/dispatcher-servlet.xml</param-value> 
        </init-param> 
        <load-on-startup>1</load-on-startup> 
    </servlet> 
    
  2. 在您dispatcher-servlet.xml文件,你需要提供的配置如何支持您的Web-MVC應用程序。在該文件中,您將提供bean配置以在Web應用程序上下文中「生活」,這將控制spring-mvc項目中的處理請求。

有了這樣說,只是添加下一行的dispatcher-servlet.xml

  • <mvc:annotation-driven />纔能有春天網絡MVC註釋在您的項目支持,如:@Controller & @RequestMapping,再加上它'會給你其他彈簧web mvc功能的支持,如數據綁定,自定義驗證等'
  • <context:component-scan base-package="org.your.controller.package" />這將告訴IOC容器你的控制器在你的項目中的位置。
  • 將您的視圖解析器放入dispatcher-servlet.xml,該解析器bean應該存在於Web應用程序上下文中。對於eaxmple:

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
        <property name="prefix" value="/WEB-INF/views/" /> 
        <property name="suffix" value=".jsp" /> 
    </bean> 
    

在你的情況,你把視圖解析器的bean不是web應用程序上下文中預期,就那種有一個上下文中所有的「活」豆的混合物。當然,你錯過了已經提到的配置

+0

dispatcher-servlet.xml是在WEB-INF下,但就像我說我懷疑它實際上正在讀取。 @Controller類型註釋已被我的REST API使用,以及我作爲第一位代碼包含的HomeController。我的RestApiApplication已經告訴程序在哪個程序包中找到控制器,存儲庫等,以及那些東西的工作原理。這是沒有被閱讀的XML的東西。我試着擴展AbstractAnnotationConfigDispatcherServletInitializer來複制xml,但調試器顯示沒有調用它的函數。 – WindowsWeenie