Ich habe eine kleine Spring-Boot-App, die eine API durch eine Steuerung exponiert. Der Controller verwendet einige Dienste, die Benutzer mongodb-Repositorys.Spring Boot Web App nicht starten
Mein 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>
Der Controller:
@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);
}
}
Die Hauptanwendungsklasse:
@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;
}
}
Wenn ich mvn Feder-boot laufen: Lauf aus dem Komma nd line oder von Eclipse bekomme ich alle möglichen Fehler. Wenn ich die "servletContainer" Methode entfernen, die ich erhalten:
org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
Wenn es da ist, erhalte ich einen anderen Fehler:
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 ist das Hinzufügen von tomcat-einzubetten-Core-8.5.11 auf die Abhängigkeiten , sodass eine Klasse existiert, die als nicht gefunden gemeldet wird. Das ist sehr verwirrend für mich.
Ich habe auch einige Demo-Projekte ausprobiert, die ich im Internet gefunden habe, aber ich kann keine Spring-Boot-Anwendung mit einem eingebetteten Container, der nach Anfragen lauscht, erhalten.
Kann jemand darauf hinweisen, was ich falsch mache?
Vielen Dank.
Können Sie bitte die vollständige Ausnahme Stacktrace hinzufügen? Auf den ersten Blick sieht Ihr Code gut aus. Können Sie bitte versuchen, 'mvn clean install' auszuführen, bevor Sie' mvn spring-boot: run' ausführen? – artemisian
Ich werde eine Antwort mit dem Stacktrace erstellen. – Cristian