2017-02-19 228 views
2

我有一個小型彈簧啓動應用程序,通過控制器公開API。控制器使用一些服務,用戶mongodb存儲庫。Spring Boot web應用程序未啓動

我的pom.xml:

<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.springboot.testapp</groupId> 
<artifactId>event-api</artifactId> 
<version>1.0.0-SNAPSHOT</version> 

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.5.1.RELEASE</version> 
</parent> 

<properties> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
</properties> 

<dependencies> 
    <!-- MONGO DB --> 
    <dependency> 
     <groupId>org.mongodb</groupId> 
     <artifactId>mongo-java-driver</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-mongodb</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-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-mongodb</artifactId> 
    </dependency> 
</dependencies> 

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

控制器:

@Controller 
public class EventController { 

    @Autowired 
    private EventService eventService; 

    @Autowired 
    private EventAttendantService eventAttendantService; 

    @Autowired 
    private EventDayService eventDayService; 

    @GetMapping(value = "/event/{id}") 
    @ResponseBody 
    public Event getEventById(@PathVariable Long id) { 
     return eventService.getEventById(id); 
    } 

    @GetMapping(value = "/eventDays") 
    @ResponseBody 
    public List<EventDay> getEventDays() { 
     return eventDayService.getAllEventDays(); 
    } 

    @GetMapping(value = "/eventDay/{id}") 
    @ResponseBody 
    public List<Event> getEventsForDay(@PathVariable Long eventDayId) { 
     EventDay eventDay = eventDayService.findById(eventDayId); 

     List<Event> events = eventDay.getEvents() 
       .stream() 
       .map(id -> eventService.getEventById(id)) 
       .collect(Collectors.toList()); 

     events.sort(new Comparator<Event>() { 
      @Override 
      public int compare(Event o1, Event o2) { 
       return o1.getStartTime().compareTo(o2.getStartTime()); 
      } 
     }); 

     return events; 
    } 

    @GetMapping(value = "/event/{id}/attendants") 
    @ResponseBody 
    public List<EventAttendant> getAttendantsForEvent(@PathVariable Long eventId) { 
     Event event = eventService.getEventById(eventId); 

     return event.getAttendants() 
       .stream() 
       .map(id -> eventAttendantService.getById(id)) 
       .collect(Collectors.toList()); 
    } 

    @PostMapping(value = "/eventDay") 
    @ResponseBody 
    public EventDay createEventDay(@RequestParam(value = "date") String date) { 
     return eventDayService.createEventDay(date); 
    } 

    @DeleteMapping(value = "/eventDay/{eventDayId}") 
    public void removeEventDay(@PathVariable(value = "eventDayId") Long eventDayId) { 
     EventDay eventDay = eventDayService.findById(eventDayId); 

     eventDay.getEvents() 
       .stream() 
       .forEach(eventId -> eventService.deleteEvent(eventId)); 

     eventDayService.removeEventDay(eventDayId); 
    } 

    @PostMapping(value = "/event") 
    @ResponseBody 
    public Event createEvent(@RequestParam(value = "eventDayId") Long eventDayId, 
      @RequestParam(value = "name") String name, 
      @RequestParam(value = "description") String description, 
      @RequestParam(value = "location") String location, 
      @RequestParam(value = "startTime") String startTime, 
      @RequestParam(value = "endTime") String endTime) { 
     Event event = eventService.createEvent(name, description, location, startTime, endTime); 

     eventDayService.addEvent(eventDayId, event.getId()); 

     return event; 
    } 

    @DeleteMapping(value = "/event/{eventId}") 
    @ResponseBody 
    public void removeEvent(@PathVariable(value = "eventId") Long eventId) { 
     List<EventDay> allEventDays = eventDayService.getAllEventDays(); 
     Optional<EventDay> eventDayForEvent = allEventDays.stream() 
       .filter(eventDay -> eventDay.getEvents().contains(eventId)) 
       .findFirst(); 

     if (eventDayForEvent.isPresent()) { 
      eventDayService.removeEvent(eventId, eventDayForEvent.get().getId()); 
     } 
    } 

    @PostMapping(value = "/attendant") 
    @ResponseBody 
    public EventAttendant createAttendant(@RequestParam(value = "firstName") String firstName, 
      @RequestParam(value = "lastName") String lastName) { 

     return eventAttendantService.create(firstName, lastName); 
    } 

    @PostMapping("/event/assign") 
    public void assignAttendant(@RequestParam(value = "eventId") Long eventId, 
      @RequestParam(value = "attendantId") Long attendantId) { 

     eventService.addAttendant(eventId, attendantId); 
    } 

    @PostMapping("/event/remove") 
    public void removeAttendant(@RequestParam(value = "eventId") Long eventId, 
      @RequestParam(value = "attendantId") Long attendantId) { 

     eventService.removeAttendant(eventId, attendantId); 
    } 
} 

主要應用類:

@SpringBootApplication(scanBasePackages = "com.springboot.test") 
public class EventsAPI { 

    private static final Logger LOG = LoggerFactory.getLogger(EventsAPI .class); 

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

    @Bean 
    public EmbeddedServletContainerFactory servletContainer() { 
     TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); 
     factory.setPort(9000); 
     factory.setSessionTimeout(10, TimeUnit.MINUTES); 
     return factory; 
    } 
} 

當我運行mvn春天啓動:從逗號運行nd行或從Eclipse我得到各種錯誤。如果我刪除 「servletContainer」 的方法,我得到:

org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. 

如果它的存在,我得到另一個錯誤:

Caused by: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'servletContainer' defined in com.centric.centricexpress.CentricExpressAPI: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.context.embedded.EmbeddedServletContainerFactory]: Factory method 'servletContainer' threw exception; nested exception is java.lang.NoClassDefFoundError: org/apache/catalina/LifecycleListener 

Maven是增加Tomcat的嵌入核心-8.5.11的依賴,以便報告爲未找到的類存在。這對我來說很困惑。

我也嘗試了一些演示項目,我在互聯網上找到了,但我無法設法啓動並運行任何spring-boot應用程序,並使用嵌入容器監聽請求。

有人能指出我做錯了什麼嗎?

非常感謝。

+0

能否請您添加完整的異常堆棧跟蹤?乍一看,你的代碼看起來很好。在運行'mvn spring-boot:run'之前,你可以試試運行'mvn clean install'嗎? – artemisian

+0

我將用堆棧跟蹤創建一個答案。 – Cristian

回答

1

ClassNotFoundException是您的env問題。 org/apache/catalina/LifecycleListener類是org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.11的一部分,它是 org.springframework.boot:spring-boot-starter-web:jar:1.5.1.RELEASE的依賴項,如下面的項目完整依賴關係樹(mvn dependency:tree)所示。

請運行mvn clean spring-boot:run

[INFO] +- org.mongodb:mongo-java-driver:jar:3.4.1:compile 
[INFO] +- org.springframework.data:spring-data-mongodb:jar:1.10.0.RELEASE:compile 
[INFO] | +- org.springframework:spring-tx:jar:4.3.6.RELEASE:compile 
[INFO] | +- org.springframework:spring-context:jar:4.3.6.RELEASE:compile 
[INFO] | | \- org.springframework:spring-aop:jar:4.3.6.RELEASE:compile 
[INFO] | +- org.springframework:spring-beans:jar:4.3.6.RELEASE:compile 
[INFO] | +- org.springframework:spring-core:jar:4.3.6.RELEASE:compile 
[INFO] | +- org.springframework:spring-expression:jar:4.3.6.RELEASE:compile 
[INFO] | +- org.springframework.data:spring-data-commons:jar:1.13.0.RELEASE:compile 
[INFO] | +- org.slf4j:slf4j-api:jar:1.7.22:compile 
[INFO] | \- org.slf4j:jcl-over-slf4j:jar:1.7.22:compile 
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided 
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.5.1.RELEASE:compile 
[INFO] | +- org.springframework.boot:spring-boot-starter:jar:1.5.1.RELEASE:compile 
[INFO] | | +- org.springframework.boot:spring-boot:jar:1.5.1.RELEASE:compile 
[INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:1.5.1.RELEASE:compile 
[INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:1.5.1.RELEASE:compile 
[INFO] | | | +- ch.qos.logback:logback-classic:jar:1.1.9:compile 
[INFO] | | | | \- ch.qos.logback:logback-core:jar:1.1.9:compile 
[INFO] | | | +- org.slf4j:jul-to-slf4j:jar:1.7.22:compile 
[INFO] | | | \- org.slf4j:log4j-over-slf4j:jar:1.7.22:compile 
[INFO] | | \- org.yaml:snakeyaml:jar:1.17:runtime 
[INFO] | +- org.springframework.boot:spring-boot-starter-tomcat:jar:1.5.1.RELEASE:compile 
[INFO] | | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.11:compile 
[INFO] | | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.11:compile 
[INFO] | | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.11:compile 
[INFO] | +- org.hibernate:hibernate-validator:jar:5.3.4.Final:compile 
[INFO] | | +- javax.validation:validation-api:jar:1.1.0.Final:compile 
[INFO] | | +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile 
[INFO] | | \- com.fasterxml:classmate:jar:1.3.3:compile 
[INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.6:compile 
[INFO] | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile 
[INFO] | | \- com.fasterxml.jackson.core:jackson-core:jar:2.8.6:compile 
[INFO] | +- org.springframework:spring-web:jar:4.3.6.RELEASE:compile 
[INFO] | \- org.springframework:spring-webmvc:jar:4.3.6.RELEASE:compile 
[INFO] \- org.springframework.boot:spring-boot-starter-data-mongodb:jar:1.5.1.RELEASE:compile 
[INFO] \- org.mongodb:mongodb-driver:jar:3.4.1:compile 
[INFO]  +- org.mongodb:mongodb-driver-core:jar:3.4.1:compile 
[INFO]  \- org.mongodb:bson:jar:3.4.1:compile 
+0

這裏是完整的stracktrace: – Cristian

相關問題