feat: Implemented problem-details for `ChannelNotReadyException`
authorKai Moritz <kai@juplo.de>
Sat, 16 Mar 2024 20:01:11 +0000 (21:01 +0100)
committerKai Moritz <kai@juplo.de>
Fri, 22 Mar 2024 16:39:20 +0000 (17:39 +0100)
src/main/java/de/juplo/kafka/chat/backend/api/ChatBackendControllerAdvice.java
src/main/java/de/juplo/kafka/chat/backend/implementation/kafka/ChannelNotReadyException.java

index 6911ba1..95977d8 100644 (file)
@@ -1,6 +1,7 @@
 package de.juplo.kafka.chat.backend.api;
 
 import de.juplo.kafka.chat.backend.domain.exceptions.*;
+import de.juplo.kafka.chat.backend.implementation.kafka.ChannelNotReadyException;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ProblemDetail;
@@ -174,4 +175,31 @@ public class ChatBackendControllerAdvice
 
     return problem;
   }
+
+  @ExceptionHandler(ChannelNotReadyException.class)
+  public final ProblemDetail handleException(
+      ChannelNotReadyException e,
+      ServerWebExchange exchange,
+      UriComponentsBuilder uriComponentsBuilder)
+  {
+    final HttpStatus status = HttpStatus.SERVICE_UNAVAILABLE;
+    ProblemDetail problem = ProblemDetail.forStatus(status);
+
+    problem.setProperty("timestamp", new Date());
+
+    problem.setProperty("requestId", exchange.getRequest().getId());
+
+    problem.setType(uriComponentsBuilder.replacePath(contextPath).path("/problem/channel-not-ready").build().toUri());
+
+    StringBuilder stringBuilder = new StringBuilder();
+    stringBuilder.append(status.getReasonPhrase());
+    stringBuilder.append(" - Channel not ready");
+    problem.setTitle(stringBuilder.toString());
+
+    problem.setDetail(e.getMessage());
+
+    problem.setProperty("state", e.getState());
+
+    return problem;
+  }
 }
index 0746748..71c05eb 100644 (file)
@@ -1,13 +1,17 @@
 package de.juplo.kafka.chat.backend.implementation.kafka;
 
 
+import lombok.Getter;
+
+
 public class ChannelNotReadyException extends IllegalStateException
 {
+  @Getter
   public final ChannelState state;
 
   public ChannelNotReadyException(ChannelState state)
   {
-    super("Not ready! Current state: " + state);
+    super("Channel not ready! Current state: " + state);
     this.state = state;
   }
 }