Spring Boot web应用程序未启动

问题描述:

我有一个小型弹簧启动应用程序,通过控制器公开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

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