АВТОБУСНЫЙ КОНТРОЛЛЕР
Код: Выделить всё
package com.example.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.DTO.BusDTO;
import com.example.Service.BusService;
@RestController
@RequestMapping("/api/buses")
public class BusController {
@Autowired
private BusService busService;
// GET: Retrieve all buses
@GetMapping
public ResponseEntity getAllBuses() {
List buses = busService.getAllBuses();
return ResponseEntity.ok(buses);
}
// GET: Retrieve a specific bus by ID
@GetMapping("/{id}")
public ResponseEntity getBusById(@PathVariable Long id) {
BusDTO bus = busService.getBusById(id);
if (bus != null) {
return ResponseEntity.ok(bus);
} else {
return ResponseEntity.notFound().build();
}
}
// POST: Add a new bus
@PostMapping
public ResponseEntity createBus(@RequestBody BusDTO busDTO) {
BusDTO createdBus = busService.addBus(busDTO);
return ResponseEntity.ok(createdBus);
}
// Optional Test Endpoint
@GetMapping("/test")
public ResponseEntity testEndpoint() {
return ResponseEntity.ok("Test endpoint is working!");
}
}
Код: Выделить всё
package com.example.DTO;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.Size;
public class BusDTO {
private Long busNr;
@NotNull(message = "Model cannot be null")
@Size(max = 100, message = "Model name cannot exceed 100 characters")
@JsonProperty("modell")
private String modell;
@NotNull(message = "Availability status cannot be null")
@JsonProperty("bereit")
private Boolean bereit;
@NotNull(message = "Number of seats cannot be null")
@Positive(message = "Number of seats must be positive")
@JsonProperty("sitzAnz")
private Integer sitzAnz;
// Getters and Setters
public Long getBusNr() {
return busNr;
}
public void setBusNr(Long busNr) {
this.busNr = busNr;
}
public String getModell() {
return modell;
}
public void setModell(String modell) {
this.modell = modell;
}
public Boolean getBereit() {
return bereit;
}
public void setBereit(Boolean bereit) {
this.bereit = bereit;
}
public Integer getSitzAnz() {
return sitzAnz;
}
public void setSitzAnz(Integer sitzAnz) {
this.sitzAnz = sitzAnz;
}
}
Код: Выделить всё
package com.example.Entity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Bus {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long busNr;
private String modell;
private boolean bereit;
private int sitzAnz;
// Getters und Setters
public Long getBusNr() {
return busNr;
}
public void setBusNr(Long busNr) {
this.busNr = busNr;
}
public String getModell() {
return modell;
}
public void setModell(String modell) {
this.modell = modell;
}
public boolean isBereit() {
return bereit;
}
public void setBereit(boolean bereit) {
this.bereit = bereit;
}
public int getSitzAnz() {
return sitzAnz;
}
public void setSitzAnz(int sitzAnz) {
this.sitzAnz = sitzAnz;
}
}
Код: Выделить всё
package com.example.Service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.DTO.BusDTO;
import com.example.Entity.Bus;
import com.example.repository.BusRepository;
@Service
public class BusService {
@Autowired
private BusRepository busRepository;
public BusDTO addBus(BusDTO busDTO) {
Bus bus = new Bus();
bus.setModell(busDTO.getModell());
bus.setBereit(busDTO.getBereit());
bus.setSitzAnz(busDTO.getSitzAnz());
bus = busRepository.save(bus);
BusDTO savedDTO = new BusDTO();
savedDTO.setBusNr(bus.getBusNr());
savedDTO.setModell(bus.getModell());
savedDTO.setBereit(bus.isBereit());
savedDTO.setSitzAnz(bus.getSitzAnz());
return savedDTO;
}
public List getAllBuses() {
return busRepository.findAll()
.stream()
.map(bus -> {
BusDTO dto = new BusDTO();
dto.setBusNr(bus.getBusNr());
dto.setModell(bus.getModell());
dto.setBereit(bus.isBereit());
dto.setSitzAnz(bus.getSitzAnz());
return dto;
})
.toList();
}
public BusDTO getBusById(Long id) {
return busRepository.findById(id)
.map(bus -> {
BusDTO dto = new BusDTO();
dto.setBusNr(bus.getBusNr());
dto.setModell(bus.getModell());
dto.setBereit(bus.isBereit());
dto.setSitzAnz(bus.getSitzAnz());
return dto;
})
.orElse(null);
}
}
Код: Выделить всё
version: "3.8"
services:
# MySQL service for Kunden
kunden-db:
image: mysql:latest
container_name: kunden-db
environment:
MYSQL_DATABASE: kundenDB
MYSQL_ROOT_PASSWORD: root-new
ports:
- "3307:3306"
volumes:
- kunden-db-data:/var/lib/mysql
- ./DB/conf/kunden.sql:/docker-entrypoint-initdb.d/kunden.sql
networks:
- app-network
# MySQL service for Fahrzeuge
fahrzeug-db:
image: mysql:latest
container_name: fahrzeug-db
environment:
MYSQL_DATABASE: fahrzeugDB
MYSQL_ROOT_PASSWORD: root-new
ports:
- "3308:3306"
volumes:
- fahrzeug-db-data:/var/lib/mysql
- ./DB/conf/fahrzeug.sql:/docker-entrypoint-initdb.d/fahrzeug.sql
networks:
- app-network
# Spring Boot application
spring-boot-app:
build:
context: .
dockerfile: Dockerfile
container_name: spring-boot-app
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://fahrzeug-db:3306/fahrzeugDB
SPRING_DATASOURCE_USERNAME: backend
SPRING_DATASOURCE_PASSWORD: backend-pass
SPRING_JPA_HIBERNATE_DDL_AUTO: update
ports:
- "8082:8080"
depends_on:
- fahrzeug-db
- kunden-db
networks:
- app-network
volumes:
kunden-db-data:
fahrzeug-db-data:
networks:
app-network:
driver: bridge
Код: Выделить всё
USE fahrzeugDB;
CREATE TABLE fahrzeug (
fahrzeugNr INT AUTO_INCREMENT PRIMARY KEY,
modell VARCHAR(100),
bereit BOOLEAN,
sitzAnz INT
) CHARACTER SET utf8mb4;
create user 'backend' identified by 'backend-pass';
grant select, insert, delete, update on fahrzeug to 'backend';
Код: Выделить всё
2024-11-20T11:29:35.651Z WARN 1 --- [ws2024_team_f] [ main] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL "create table bus (bus_nr bigint not null auto_increment, bereit bit not null, modell varchar(255), sitz_anz integer not null, primary key (bus_nr)) engine=InnoDB" via JDBC [CREATE command denied to user 'backend'@'172.19.0.4' for table 'bus']
в org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:94) ~[hibernate-core-6.5. 3.Final.jar!/:6.5.3.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:583) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:523) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.createTable(AbstractSchemaMigrator.java:323) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:80) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:240) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:119) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:280) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:144) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at java.base/java.util.HashMap.forEach(HashMap.java:1429) ~[na:na]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:141) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:322) ~[hibernate-core-6.5. 3.Final.jar!/:6.5.3.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:457) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1506) ~[hibernate-core-6.5.3.Final.jar!/:6.5.3.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[spring-orm-6.1.14.jar!/:6.1.14]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.1.14.jar!/:6.1.14]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.1.14.jar!/:6.1.14]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.1.14.jar!/:6.1.14]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.1.14.jar!/:6.1.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1853) ~[spring-beans-6.1.14.jar!/:6.1.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) ~[spring-beans-6.1.14.jar!/:6.1.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[spring-beans-6.1.14.jar!/:6.1.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.14.jar!/:6.1.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.14.jar!/:6.1.14]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.14.jar!/:6.1.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.14.jar!/:6.1.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) ~[spring-beans-6.1.14.jar!/:6.1.14]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:954) ~[spring-context-6.1.14.jar!/:6.1.14]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625) ~[spring-context-6.1.14.jar!/:6.1.14]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.3.5.jar!/:3.3.5]
в org.springframework.boot .SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.3.5.jar!/:3.3.5]
в org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.3.5.jar !/:3.3.5]
в org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.3.5.jar!/:3.3.5]
в org.springframework.boot.SpringApplication.run(SpringApplication .java:1363) ~[spring-boot-3.3.5.jar!/:3.3.5]
в org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) ~[spring-boot-3.3.5.jar !/:3.3.5]
в com.example.Ws2024TeamFApplication.main(Ws2024TeamFApplication.java:11) ~[!/:0.0.1-SNAPSHOT]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[на:на]
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
at org.springframework.boot.loader.launch.Launcher.launch(Launcher. java:102) ~[app.jar:0.0.1-SNAPSHOT]
at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64) ~[app.jar:0.0.1-SNAPSHOT]
на org.springframework.boot.loader.launch.JarLauncher.main (JarLauncher.java:40) ~[app.jar:0.0.1-SNAPSHOT]
Вызвано автор: java.sql.SQLSyntaxErrorException: команда CREATE отклонена пользователю 'backend'@'172.19.0.4' для таблицы 'bus'
в com.mysql.cj.jdbc.Exceptions.SQLError.createSQLException(SQLError.java: 121) ~[mysql-connector-j-8.3.0.jar!/:8.3.0]
at com.mysql.cj.jdbc.Exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.3.0.jar!/:8.3.0]
at com.mysql.cj .jdbc.StatementImpl.executeInternal(StatementImpl.java:770) ~[mysql-connector-j-8.3.0.jar!/:8.3.0]
на com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:653) ~[mysql-connector-j -8.3.0.jar!/:8.3.0]
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94) ~[HikariCP-5.1.0.jar!/:na]
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement .java) ~[HikariCP-5.1.0.jar!/:na]
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:80) ~[hibernate-core-6.5.3 .Final.jar!/:6.5.3.Final]
... 42 общих фрейма опущен
2024-11-20T11:29:35.659Z INFO 1 --- [ws2024_team_f] [ main] j.LocalContainerEntityManagerFactoryBean : Инициализированный JPA EntityManagerFactory для единицы персистентности «по умолчанию»
2024-11-20T11:29:36.060Z ПРЕДУПРЕЖДЕНИЕ 1 --- [ws2024_team_f] [ main] JpaBaseConfiguration$JpaWebConfiguration : Spring.jpa.open-in-view включен по умолчанию. Таким образом, запросы к базе данных могут выполняться во время рендеринга представления. Явно настройте Spring.jpa.open-in-view, чтобы отключить это предупреждение
2024-11-20T11:29:36.471Z WARN 1 --- [ws2024_team_f] [ main].s.s.UserDetailsServiceAutoConfiguration :
Использование сгенерированного пароля безопасности: 25e64de9-731e-495b-a589-34cb7c057fe1
Этот сгенерированный пароль предназначен только для разработчиков. Перед запуском приложения в рабочей среде необходимо обновить конфигурацию безопасности.
2024-11-20T11:29:36.496Z INFO 1 --- [ws2024_team_f] [ main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager настроен с помощью bean-компонента UserDetailsService с именем inMemoryUserDetailsManager
2024-11-20T11:29:36.703Z INFO 1 --- [ws2024_team_f] [main] o.s.b.w.embedded.tomcat.TomcatWebServer: Tomcat запущен на порту 8080 (http) с контекстным путем '/'
2024- 11-20T11:29:36.732Z INFO 1 --- [ws2024_team_f] [ main] com.example.Ws2024TeamFApplication : Ws2024TeamFApplication запущено за 4,901 секунды (процесс выполняется для 5,466)
2024-11-20T11:30:20.500Z INFO 1 --- [ws2024_team_f] [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Инициализация Spring DispatcherServlet 'dispatcherServlet'
2024-11-20T11:30:20.501Z INFO 1 --- [ws2024_team_f] [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Инициализация сервлета 'dispatcherServlet'
2024-11-20T11:30:20.504Z INFO 1 --- [ws2024_team_f] [nio- 8080-exec-2] o.s.web.servlet.DispatcherServlet: инициализация завершена за 3 мс
2024-11-20T11:30:20.716Z WARN 1 --- [ws2024_team_f] [nio-8080-exec-2].w.s.m.s.DefaultHandlerExceptionResolver: решено [org.springframework.web.HttpRequestMethodNotSupportedException: метод запроса «GET» не поддерживается]
Я продолжал пытаться настроить контроллер и класс обслуживания для поддержки метода GET, но возникает та же ошибка < /п>
Подробнее здесь: https://stackoverflow.com/questions/792 ... ot-allowed