Add Global Exception Handler Classes and OrderGlobalException.java classes

This commit is contained in:
Ali CANLI
2022-07-11 12:11:27 +03:00
parent 80bc6c6de7
commit 9780156ea8
10 changed files with 198 additions and 3 deletions

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>common</artifactId>
<groupId>com.food.order</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>common-application</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,7 @@
package com.food.order.system.application.handler;
import lombok.Builder;
@Builder
public record ErrorDTO(String code, String message) {
}

View File

@@ -0,0 +1,59 @@
package com.food.order.system.application.handler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.ValidationException;
import java.util.stream.Collectors;
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(value = {Exception.class})
@ResponseBody
public ErrorDTO handleOrderDomainException(Exception e) {
log.error("Error occurred: {}", e.getMessage());
return ErrorDTO.builder()
.code(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase())
.message("Unknown error occurred")
.build();
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = {ValidationException.class})
@ResponseBody
public ErrorDTO handleOrderDomainException(ValidationException e) {
ErrorDTO errorDTO;
if (e instanceof ConstraintViolationException) {
String violations = extractViolationsFromException((ConstraintViolationException) e);
log.error("Error occurred: {}", violations);
errorDTO = ErrorDTO.builder()
.code(HttpStatus.BAD_REQUEST.getReasonPhrase())
.message(violations)
.build();
}
else {
log.error("Error occurred: {}", e.getMessage());
errorDTO = ErrorDTO.builder()
.code(HttpStatus.BAD_REQUEST.getReasonPhrase())
.message(e.getMessage())
.build();
}
return errorDTO;
}
private String extractViolationsFromException(ConstraintViolationException e) {
return e.getConstraintViolations()
.stream()
.map(ConstraintViolation::getMessage)
.collect(Collectors.joining("->"));
}
}

View File

@@ -13,6 +13,7 @@
<packaging>pom</packaging>
<modules>
<module>common-domain</module>
<module>common-application</module>
</modules>
<properties>

View File

@@ -19,6 +19,21 @@
<groupId>com.food.order</groupId>
<artifactId>order-application-service</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.food.order</groupId>
<artifactId>common-application</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,43 @@
package com.food.order.system.service.app.api;
import com.food.order.domain.dto.create.CreateOrderCommand;
import com.food.order.domain.dto.create.CreateOrderResponse;
import com.food.order.domain.dto.track.TrackOrderQuery;
import com.food.order.domain.dto.track.TrackOrderResponse;
import com.food.order.domain.ports.input.service.OrderApplicationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.annotation.RequestScope;
import java.util.UUID;
@RestController
@CrossOrigin
@RequestScope
@RequiredArgsConstructor
@Slf4j
@Validated
@RequestMapping(value = "/api/orders", produces = "application/vnd.api.v1+json")
public class OrderController {
private final OrderApplicationService orderApplicationService;
@PostMapping
public ResponseEntity<CreateOrderResponse> createOrder(@RequestBody CreateOrderCommand createOrderCommand) {
log.info("Creating order with command: {}", createOrderCommand);
CreateOrderResponse createOrderResponse = orderApplicationService.createOrder(createOrderCommand);
log.info("Created order with tracking id: {}", createOrderResponse.orderTrackingId());
return ResponseEntity.ok(createOrderResponse);
}
@GetMapping("/{orderTrackingId}")
public ResponseEntity<TrackOrderResponse> trackOrder(@PathVariable("orderTrackingId") UUID orderTrackingId) {
TrackOrderResponse trackOrderResponse = orderApplicationService.trackOrder
(new TrackOrderQuery(orderTrackingId));
log.info("Tracked order with tracking id: {}", orderTrackingId);
return ResponseEntity.ok(trackOrderResponse);
}
}

View File

@@ -0,0 +1,42 @@
package com.food.order.system.service.app.exception;
import com.food.order.system.application.handler.ErrorDTO;
import com.food.order.system.application.handler.GlobalExceptionHandler;
import com.food.order.system.domain.exception.OrderDomainException;
import com.food.order.system.domain.exception.OrderNotFoundException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
@ControllerAdvice
@Slf4j
public class OrderGlobalException extends GlobalExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = {OrderDomainException.class})
@ResponseBody
public ErrorDTO handleOrderDomainException(OrderDomainException e) {
log.error("Error occurred: {}", e.getMessage());
return ErrorDTO.builder()
.code(HttpStatus.BAD_REQUEST.getReasonPhrase())
.message(e.getMessage())
.build();
}
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(value = {OrderNotFoundException.class})
@ResponseBody
public ErrorDTO handleOrderDomainException(OrderNotFoundException e) {
log.error("Error occurred: {}", e.getMessage());
return ErrorDTO.builder()
.code(HttpStatus.NOT_FOUND.getReasonPhrase())
.message(e.getMessage())
.build();
}
}

View File

@@ -1,8 +1,6 @@
package com.food.order.domain.dto.create;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;

View File

@@ -1,6 +1,5 @@
package com.food.order.domain.dto.track;
import lombok.AllArgsConstructor;
import lombok.Builder;
import javax.validation.constraints.NotNull;

View File

@@ -58,6 +58,11 @@
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.food.order</groupId>
<artifactId>common-application</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.food.order</groupId>