diff --git a/car/src/main/java/cz/muni/pa165/car/service/DriverManagerService.java b/car/src/main/java/cz/muni/pa165/car/service/DriverManagerService.java index 44efb85a0e3d31512a158921c0566106f7e22eb3..8a80a740b72ec155d2971beef633ed59a73416e3 100644 --- a/car/src/main/java/cz/muni/pa165/car/service/DriverManagerService.java +++ b/car/src/main/java/cz/muni/pa165/car/service/DriverManagerService.java @@ -1,7 +1,7 @@ package cz.muni.pa165.car.service; import cz.muni.pa165.car.data.repository.CarRepository; -import cz.muni.pa165.common_library.exceptions.DatabaseException; +import cz.muni.pa165.common_library.exception.DatabaseException; import cz.muni.pa165.common_library.racecomponents.Car; import org.springframework.stereotype.Service; diff --git a/common_library/src/main/java/cz/muni/pa165/common_library/exceptions/DatabaseException.java b/common_library/src/main/java/cz/muni/pa165/common_library/exception/DatabaseException.java similarity index 80% rename from common_library/src/main/java/cz/muni/pa165/common_library/exceptions/DatabaseException.java rename to common_library/src/main/java/cz/muni/pa165/common_library/exception/DatabaseException.java index 227b9a113ce56809dcc7ce7deedac992f9729096..52a05fb33cacbb98e03f839213e38e097aa68dd5 100644 --- a/common_library/src/main/java/cz/muni/pa165/common_library/exceptions/DatabaseException.java +++ b/common_library/src/main/java/cz/muni/pa165/common_library/exception/DatabaseException.java @@ -1,4 +1,4 @@ -package cz.muni.pa165.common_library.exceptions; +package cz.muni.pa165.common_library.exception; /** * Exception when a query does is not executed correctly. diff --git a/common_library/src/main/java/cz/muni/pa165/common_library/ExError.java b/common_library/src/main/java/cz/muni/pa165/common_library/exception/ExError.java similarity index 74% rename from common_library/src/main/java/cz/muni/pa165/common_library/ExError.java rename to common_library/src/main/java/cz/muni/pa165/common_library/exception/ExError.java index ae15e2fdfa1f86937a43606cd79bc7547714d621..8a20ed8613573e0fc3ce255e612859c3eb9e3537 100644 --- a/common_library/src/main/java/cz/muni/pa165/common_library/ExError.java +++ b/common_library/src/main/java/cz/muni/pa165/common_library/exception/ExError.java @@ -1,4 +1,4 @@ -package cz.muni.pa165.common_library; +package cz.muni.pa165.common_library.exception; import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDateTime; @@ -7,7 +7,7 @@ import lombok.Getter; public class ExError { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss") - private final LocalDateTime timestamp = LocalDateTime.now(); + private final LocalDateTime dateTime = LocalDateTime.now(); @Getter private final String message; diff --git a/common_library/src/main/java/cz/muni/pa165/common_library/exceptions/ResourceNotFoundException.java b/common_library/src/main/java/cz/muni/pa165/common_library/exception/ResourceNotFoundException.java similarity index 80% rename from common_library/src/main/java/cz/muni/pa165/common_library/exceptions/ResourceNotFoundException.java rename to common_library/src/main/java/cz/muni/pa165/common_library/exception/ResourceNotFoundException.java index 84517c811e0a1362bf2b9f604e63b5f9137915a7..eaeb206f378b375c22c20ae431878d6ec5c698ff 100644 --- a/common_library/src/main/java/cz/muni/pa165/common_library/exceptions/ResourceNotFoundException.java +++ b/common_library/src/main/java/cz/muni/pa165/common_library/exception/ResourceNotFoundException.java @@ -1,4 +1,4 @@ -package cz.muni.pa165.common_library.exceptions; +package cz.muni.pa165.common_library.exception; /** * Exception when resource does not exist. diff --git a/common_library/src/main/java/cz/muni/pa165/common_library/exception/RestExceptionHandler.java b/common_library/src/main/java/cz/muni/pa165/common_library/exception/RestExceptionHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..620a094964c82e26eeaaa98927f09b357eb78392 --- /dev/null +++ b/common_library/src/main/java/cz/muni/pa165/common_library/exception/RestExceptionHandler.java @@ -0,0 +1,72 @@ +package cz.muni.pa165.common_library.exception; + +import jakarta.persistence.EntityNotFoundException; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.FieldError; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.NoHandlerFoundException; + +@RestControllerAdvice +public class RestExceptionHandler { + + @ExceptionHandler(EntityNotFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public ResponseEntity<ExError> handleEntityNotFoundException(EntityNotFoundException ex) { + System.out.println(); + return new ResponseEntity<>( + new ExError(ex.getMessage()), new HttpHeaders(), HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(DatabaseException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public ResponseEntity<ExError> handleDatabaseException(DatabaseException ex) { + return new ResponseEntity<>( + new ExError(ex.getMessage()), new HttpHeaders(), HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(NoHandlerFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public ResponseEntity<ExError> handleDatabaseException(NoHandlerFoundException ex) { + return new ResponseEntity<>( + new ExError(ex.getMessage()), new HttpHeaders(), HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(HttpMessageNotReadableException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ResponseEntity<ExError> handleNotReadableException(HttpMessageNotReadableException ex) { + return new ResponseEntity<>( + new ExError(ex.getMessage()), new HttpHeaders(), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ResponseEntity<ExError> handleNotReadableException(MethodArgumentNotValidException ex) { + String message = ex.getMessage(); + try { + + StringBuilder validtionMessage = new StringBuilder("Validation Errors: ["); + var validationErrors = ex.getBindingResult().getAllErrors(); + for (ObjectError error: validationErrors) { + var errorField = (FieldError) error; + var errorMessage = errorField.getDefaultMessage(); + var fieldName = errorField.getField(); + + validtionMessage.append(" field ").append(fieldName).append(": ").append(errorMessage).append(","); + } + validtionMessage.deleteCharAt(validtionMessage.length() - 1); + validtionMessage.append(" ]"); + message = validtionMessage.toString(); + } catch (Exception ignored) { + + } + return new ResponseEntity<>( + new ExError(message), new HttpHeaders(), HttpStatus.BAD_REQUEST); + } +} diff --git a/driver/src/main/java/cz/muni/pa165/driver/service/DriverInitService.java b/driver/src/main/java/cz/muni/pa165/driver/service/DriverInitService.java index d2ab9960c4d68a5033fefe5eac05b0d52c0f28fd..aa160b2f81ac365feb68fc251c242b6b2f2397f9 100644 --- a/driver/src/main/java/cz/muni/pa165/driver/service/DriverInitService.java +++ b/driver/src/main/java/cz/muni/pa165/driver/service/DriverInitService.java @@ -1,7 +1,7 @@ package cz.muni.pa165.driver.service; -import cz.muni.pa165.common_library.exceptions.DatabaseException; -import cz.muni.pa165.common_library.exceptions.ResourceNotFoundException; +import cz.muni.pa165.common_library.exception.DatabaseException; +import cz.muni.pa165.common_library.exception.ResourceNotFoundException; import cz.muni.pa165.common_library.racecomponents.Driver; import cz.muni.pa165.driver.data.repository.DriverInitRepository; import org.springframework.stereotype.Service; diff --git a/race/pom.xml b/race/pom.xml index d167553f8e4ba2ab09b101a3a92bbd3ebb6a9693..b21225f237517e222b817d8ab73e74744237be96 100644 --- a/race/pom.xml +++ b/race/pom.xml @@ -48,11 +48,6 @@ <artifactId>spring-boot-starter-data-jpa</artifactId> <version>3.0.2</version> </dependency> - <dependency> - <groupId>org.hsqldb</groupId> - <artifactId>hsqldb</artifactId> - <version>2.7.1</version> - </dependency> </dependencies> <properties> <maven.compiler.source>17</maven.compiler.source> diff --git a/race/src/main/java/cz/muni/pa165/race/App.java b/race/src/main/java/cz/muni/pa165/race/App.java index 65da526906811cb27d8293fea9b8db5f8b607087..531a3a26094f008f01b473cd641db90b528060b2 100644 --- a/race/src/main/java/cz/muni/pa165/race/App.java +++ b/race/src/main/java/cz/muni/pa165/race/App.java @@ -1,5 +1,6 @@ package cz.muni.pa165.race; +import cz.muni.pa165.common_library.exception.RestExceptionHandler; import cz.muni.pa165.common_library.racecomponents.Car; import cz.muni.pa165.common_library.racecomponents.Driver; import cz.muni.pa165.common_library.racecomponents.Season; @@ -7,6 +8,7 @@ import cz.muni.pa165.common_library.racecomponents.Race; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Import; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -17,6 +19,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableJpaRepositories(basePackages = "cz.muni.pa165.race.data.repository") @EnableTransactionManagement @EntityScan(basePackageClasses = {Race.class, Season.class, Car.class, Driver.class}) +@Import(RestExceptionHandler.class) public class App { public static void main(String[] args) { diff --git a/race/src/main/java/cz/muni/pa165/race/RestExceptionHandler.java b/race/src/main/java/cz/muni/pa165/race/RestExceptionHandler.java deleted file mode 100644 index 98296c9cff0294f633a12405424e47fcef7d9c21..0000000000000000000000000000000000000000 --- a/race/src/main/java/cz/muni/pa165/race/RestExceptionHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -package cz.muni.pa165.race; - -import cz.muni.pa165.common_library.ExError; -import cz.muni.pa165.common_library.exceptions.DatabaseException; -import jakarta.persistence.EntityNotFoundException; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.servlet.NoHandlerFoundException; - -@RestControllerAdvice -public class RestExceptionHandler { - - @ExceptionHandler(EntityNotFoundException.class) - @ResponseStatus(HttpStatus.NOT_FOUND) - public ResponseEntity<ExError> handleEntityNotFoundException(EntityNotFoundException ex) { - System.out.println(); - return new ResponseEntity<>( - new ExError(ex.getMessage()), new HttpHeaders(), HttpStatus.NOT_FOUND); - } - - @ExceptionHandler(DatabaseException.class) - @ResponseStatus(HttpStatus.NOT_FOUND) - public ResponseEntity<ExError> handleDatabaseException(DatabaseException ex) { - return new ResponseEntity<>( - new ExError(ex.getMessage()), new HttpHeaders(), HttpStatus.NOT_FOUND); - } - - @ExceptionHandler(NoHandlerFoundException.class) - @ResponseStatus(HttpStatus.NOT_FOUND) - public ResponseEntity<ExError> handleDatabaseException(NoHandlerFoundException ex) { - return new ResponseEntity<>( - new ExError(ex.getMessage()), new HttpHeaders(), HttpStatus.NOT_FOUND); - } -} diff --git a/race/src/main/java/cz/muni/pa165/race/service/RaceService.java b/race/src/main/java/cz/muni/pa165/race/service/RaceService.java index b0ba6f8530067ce9f78e68b108430671dc83a646..8b89cf99eeebd8640c0d4933fdd839b01daa71a6 100644 --- a/race/src/main/java/cz/muni/pa165/race/service/RaceService.java +++ b/race/src/main/java/cz/muni/pa165/race/service/RaceService.java @@ -1,6 +1,6 @@ package cz.muni.pa165.race.service; -import cz.muni.pa165.common_library.exceptions.DatabaseException; +import cz.muni.pa165.common_library.exception.DatabaseException; import cz.muni.pa165.common_library.racecomponents.Car; import cz.muni.pa165.common_library.racecomponents.Driver; import cz.muni.pa165.common_library.racecomponents.Race; diff --git a/race/src/main/java/cz/muni/pa165/race/service/SeasonService.java b/race/src/main/java/cz/muni/pa165/race/service/SeasonService.java index 7dec2821abd6e7b95584d920dd0ebf97796ea121..6e333f9040b5025bf800718923f801a95205f1b4 100644 --- a/race/src/main/java/cz/muni/pa165/race/service/SeasonService.java +++ b/race/src/main/java/cz/muni/pa165/race/service/SeasonService.java @@ -1,7 +1,7 @@ package cz.muni.pa165.race.service; import cz.muni.pa165.common_library.racecomponents.Season; -import cz.muni.pa165.common_library.exceptions.DatabaseException; +import cz.muni.pa165.common_library.exception.DatabaseException; import cz.muni.pa165.common_library.racecomponents.Race; import cz.muni.pa165.race.api.RaceNameDto; import cz.muni.pa165.race.api.SeasonDto; diff --git a/race/src/main/resources/application.yml b/race/src/main/resources/application.yml index 9158b3e697b9f6591430251cca31926307567051..8a8fefb4d5bf5292f5b0a1e0c80d2d44c341901f 100644 --- a/race/src/main/resources/application.yml +++ b/race/src/main/resources/application.yml @@ -18,3 +18,8 @@ spring: driverClassName: org.h2.Driver username: admin password: admin + mvc: + throw-exception-if-no-handler-found: true + web: + resources: + add-mappings: false