Add Global Exception Handler Classes and OrderGlobalException.java classes
This commit is contained in:
26
common/common-application/pom.xml
Normal file
26
common/common-application/pom.xml
Normal 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>
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.food.order.system.application.handler;
|
||||
|
||||
import lombok.Builder;
|
||||
|
||||
@Builder
|
||||
public record ErrorDTO(String code, String message) {
|
||||
}
|
||||
@@ -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("->"));
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@
|
||||
<packaging>pom</packaging>
|
||||
<modules>
|
||||
<module>common-domain</module>
|
||||
<module>common-application</module>
|
||||
</modules>
|
||||
|
||||
<properties>
|
||||
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.food.order.domain.dto.track;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
Reference in New Issue
Block a user