2015-06-20 66 views
2

我正在遵循Spring in Action第4版第5章,但我被困在第一個示例中。Spring框架無法啓動嵌入式容器

這裏是我的Eclipse月神項目結構:

project structure

如果我運行這個項目作爲春季啓動應用程序,那麼它會拋出異常:

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:474) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:957) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:946) 
    at spittr.SpittrApplication.main(SpittrApplication.java:10) 
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:183) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:156) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130) 
    ... 7 common frames omitted 

我怎樣才能解決這個問題?

目錄中的所有文件的:

SpittrApplication.java:

package spittr; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
public class SpittrApplication { 

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

SpittrWebAppInitializer.java:

package spittr.config; 

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 

public class SpittrWebAppInitializer extends 
     AbstractAnnotationConfigDispatcherServletInitializer { 
    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[] { RootConfig.class }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class<?>[] { WebConfig.class }; 
    } 
} 

WebConfig.java:

package spittr.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.ViewResolver; 
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 

@Configuration 
@EnableWebMvc 
@ComponentScan("spittr.web") 
public class WebConfig extends WebMvcConfigurerAdapter { 
    @Bean 
    public ViewResolver viewResolver() { 
     InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
     resolver.setPrefix("/WEB-INF/views/"); 
     resolver.setSuffix(".jsp"); 
     resolver.setExposeContextBeansAsAttributes(true); 
     return resolver; 
    } 

    @Override 
    public void configureDefaultServletHandling(
      DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 
} 

RootConfig.java:

package spittr.config; 

import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.ComponentScan.Filter; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.FilterType; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 

@Configuration 
@ComponentScan(basePackages = { "spitter" }, excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class) }) 
public class RootConfig { 
} 

HomeController.java:

package spittr.web; 

import static org.springframework.web.bind.annotation.RequestMethod.*; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

@Controller 
public class HomeController { 
    @RequestMapping(value = "/", method = GET) 
    public String home() { 
     return "home"; 
    } 
} 

回到Home.jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ page session="false" %> 
<html> 
<head> 
<title>Spittr</title> 
<link rel="stylesheet" 
type="text/css" 
href="<c:url value="/resources/style.css" />" > 
</head> 
<body> 
<h1>Welcome to Spittr</h1> 
<a href="<c:url value="/spittles" />">Spittles</a> | 
<a href="<c:url value="/spitter/register" />">Register</a> 
</body> 
</html> 

的pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.spittr</groupId> 
    <artifactId>spittr</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>spittr</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.4.RELEASE</version> 
     <relativePath /> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

回答

6

當使用Spring啓動,你應該不包括其他春天直接依賴,但依賴在Boot自己的依賴管理上。當使用提供的「初學者」時,您可以確保所有需要的庫都將包含在匹配的版本中。

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-webmvc</artifactId> 
</dependency> 

使用web應用的專用引導啓動,spring-boot-starter-web:在the official guide


<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
</dependency> 

更多細節

相反,包括在你的pom.xml spring-mvc神器

我相信你的pom.xml的其他部分都是多餘的,以及(彈簧引導啓動,的javax.servlet-API,彈簧引導Maven的插件)

+0

感謝您的解決方案,它不會再次拋出此類異常,但在輸入http:// localhost:8080 /時,仍然無法獲得我想要的頁面,出現一個錯誤頁面時彈出:「此應用程序沒有明確的映射/錯誤,所以你看到這是一個後備。 Sat Jun 20 14:56:10 PDT 2015 有一個意外的錯誤(type = Not Found,status = 404)。 /WEB-INF/views/home.jsp「它仍然是一個與Maven相關的問題? – Bamqf

+1

將views文件夾移動到src/main/resources。這個WEB-INF文件夾,你已經存儲了模板,將不會被打包,不會在類路徑中,當你運行的應用程序。 – dunni

-2

如果您正在使用其他應用程序,它會監聽與Tomcat相同的端口偵聽,這也可能是問題。

+0

這個答案似乎沒有提供任何有關的實際問題的內容,是如此脫離主題 – berlinguyinca

+0

實際的問題是相關的技術問題,因爲tomcat容器正在提出問題,所以,不需要投票,因爲問題的所有者是該領域的新手,新手開發者可能會忘記這一方! –