Quellcode durchsuchen

Fehlerseite eingebaut

Leonard Schulz vor 1 Jahr
Ursprung
Commit
07d0d66d03

+ 47 - 0
src/main/java/com/tsystems/inwo/vgl/web/ErrorController.java

@@ -0,0 +1,47 @@
+package com.tsystems.inwo.vgl.web;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import java.util.List;
+
+@Controller
+@RequestMapping("/fehler")
+public class ErrorController {
+    
+    @GetMapping
+    public String showErrorPage(
+            @RequestParam(required = false) List<String> schemaErrors,
+            @RequestParam(required = false) List<String> parameterErrors,
+            @RequestParam(required = false) List<String> processingErrors,
+            @RequestParam(required = false) String generalError,
+            @RequestParam(required = false) String leftJson,
+            @RequestParam(required = false) String rightJson,
+            Model model) {
+        
+        model.addAttribute("schemaErrors", schemaErrors);
+        model.addAttribute("parameterErrors", parameterErrors);
+        model.addAttribute("processingErrors", processingErrors);
+        model.addAttribute("generalError", generalError);
+        model.addAttribute("leftJson", leftJson);
+        model.addAttribute("rightJson", rightJson);
+        
+        return "fehler";
+    }
+    
+    @PostMapping
+    public String handleErrorPost(
+            @RequestParam(required = false) List<String> schemaErrors,
+            @RequestParam(required = false) List<String> parameterErrors,
+            @RequestParam(required = false) List<String> processingErrors,
+            @RequestParam(required = false) String generalError,
+            @RequestParam(required = false) String leftJson,
+            @RequestParam(required = false) String rightJson,
+            Model model) {
+        
+        return showErrorPage(schemaErrors, parameterErrors, processingErrors, generalError, leftJson, rightJson, model);
+    }
+}

+ 33 - 7
src/main/java/com/tsystems/inwo/vgl/web/HhmEinkommenController.java

@@ -42,12 +42,31 @@ public class HhmEinkommenController {
             @RequestParam(required = false) String personId,
             @RequestParam(required = false) String kunde,
             @RequestHeader(value = "X-Kunde", required = false) String kundeHeader,
-            Model model) throws Exception {
-
-        String activeKunde = resolveActiveKunde(kunde, kundeHeader);
-
-        JsonNode left = om.readTree(leftJson);
-        JsonNode right = om.readTree(rightJson);
+            Model model) {
+
+        try {
+            String activeKunde = resolveActiveKunde(kunde, kundeHeader);
+
+            JsonNode left;
+            JsonNode right;
+            
+            try {
+                left = om.readTree(leftJson);
+            } catch (Exception e) {
+                model.addAttribute("parameterErrors", List.of("Left JSON ist nicht gültig: " + e.getMessage()));
+                model.addAttribute("leftJson", leftJson);
+                model.addAttribute("rightJson", rightJson);
+                return "fehler";
+            }
+            
+            try {
+                right = om.readTree(rightJson);
+            } catch (Exception e) {
+                model.addAttribute("parameterErrors", List.of("Right JSON ist nicht gültig: " + e.getMessage()));
+                model.addAttribute("leftJson", leftJson);
+                model.addAttribute("rightJson", rightJson);
+                return "fehler";
+            }
 
         if (validate) {
             List<String> err = new ArrayList<>();
@@ -59,7 +78,7 @@ public class HhmEinkommenController {
                 model.addAttribute("rightJson", rightJson);
                 model.addAttribute("validate", validate);
                 model.addAttribute("schemaName", schemaName);
-                return "test";
+                return "fehler";
             }
         }
 
@@ -122,6 +141,13 @@ public class HhmEinkommenController {
         model.addAttribute("activeKunde", activeKunde);
         model.addAttribute("pageTitle", "Haushaltsmitglieder/Einkommen");
         return "hhm-einkommen";
+        
+        } catch (Exception e) {
+            model.addAttribute("processingErrors", List.of("Fehler bei der Verarbeitung: " + e.getMessage()));
+            model.addAttribute("leftJson", leftJson);
+            model.addAttribute("rightJson", rightJson);
+            return "fehler";
+        }
     }
 
     @PostMapping("/api/person-details")

+ 33 - 7
src/main/java/com/tsystems/inwo/vgl/web/MieteController.java

@@ -41,12 +41,31 @@ public class MieteController {
             @RequestParam(required = false) String rightZeitraumId,
             @RequestParam(required = false) String kunde,
             @RequestHeader(value = "X-Kunde", required = false) String kundeHeader,
-            Model model) throws Exception {
-
-        String activeKunde = resolveActiveKunde(kunde, kundeHeader);
-
-        JsonNode left = om.readTree(leftJson);
-        JsonNode right = om.readTree(rightJson);
+            Model model) {
+
+        try {
+            String activeKunde = resolveActiveKunde(kunde, kundeHeader);
+
+            JsonNode left;
+            JsonNode right;
+            
+            try {
+                left = om.readTree(leftJson);
+            } catch (Exception e) {
+                model.addAttribute("parameterErrors", List.of("Left JSON ist nicht gültig: " + e.getMessage()));
+                model.addAttribute("leftJson", leftJson);
+                model.addAttribute("rightJson", rightJson);
+                return "fehler";
+            }
+            
+            try {
+                right = om.readTree(rightJson);
+            } catch (Exception e) {
+                model.addAttribute("parameterErrors", List.of("Right JSON ist nicht gültig: " + e.getMessage()));
+                model.addAttribute("leftJson", leftJson);
+                model.addAttribute("rightJson", rightJson);
+                return "fehler";
+            }
 
         if (validate) {
             List<String> err = new ArrayList<>();
@@ -58,7 +77,7 @@ public class MieteController {
                 model.addAttribute("rightJson", rightJson);
                 model.addAttribute("validate", validate);
                 model.addAttribute("schemaName", schemaName);
-                return "test";
+                return "fehler";
             }
         }
 
@@ -117,6 +136,13 @@ public class MieteController {
         model.addAttribute("activeKunde", activeKunde);
         model.addAttribute("pageTitle", "Miete-/Wohnungsdaten");
         return "miete";
+        
+        } catch (Exception e) {
+            model.addAttribute("processingErrors", List.of("Fehler bei der Verarbeitung: " + e.getMessage()));
+            model.addAttribute("leftJson", leftJson);
+            model.addAttribute("rightJson", rightJson);
+            return "fehler";
+        }
     }
 
     @PostMapping("/api/vorgang-change")

+ 1 - 14
src/main/java/com/tsystems/inwo/vgl/web/TestController.java

@@ -8,23 +8,10 @@ import org.springframework.web.bind.annotation.*;
 public class TestController {
 
     @GetMapping("/test")
-    public String test(
-            @RequestParam(required = false) String kunde,
-            @RequestHeader(value = "X-Kunde", required = false) String kundeHeader,
-            Model model) {
-        
-        String activeKunde = resolveActiveKunde(kunde, kundeHeader);
-        
+    public String test(Model model) {
         model.addAttribute("validate", true);
         model.addAttribute("schemaName", "haushalt-einkommen");
-        model.addAttribute("activeKunde", activeKunde);
         return "test";
     }
-
-    // ===== Private Helper Methods =====
-    
-    private String resolveActiveKunde(String kunde, String kundeHeader) {
-        return kunde != null ? kunde : kundeHeader;
-    }
     
 }

+ 159 - 0
src/main/resources/static/css/fehler.css

@@ -0,0 +1,159 @@
+.error-container {
+    max-width: 1200px;
+    margin: 2rem auto;
+    padding: 1rem;
+}
+
+.error-header {
+    background-color: #f8d7da;
+    border: 1px solid #f5c6cb;
+    border-radius: 0.375rem;
+    padding: 1.5rem;
+    margin-bottom: 2rem;
+}
+
+.error-header h1 {
+    color: #721c24;
+    margin: 0 0 1rem 0;
+    display: flex;
+    align-items: center;
+    gap: 0.5rem;
+}
+
+.error-header h1::before {
+    content: "⚠️";
+    font-size: 1.5em;
+}
+
+.error-list {
+    background-color: #fff;
+    border: 1px solid #f5c6cb;
+    border-radius: 0.375rem;
+    padding: 1rem;
+    margin-top: 1rem;
+}
+
+.error-list h3 {
+    color: #721c24;
+    margin: 0 0 0.5rem 0;
+}
+
+.error-list ul {
+    margin: 0;
+    padding-left: 1.5rem;
+}
+
+.error-list li {
+    margin-bottom: 0.5rem;
+    color: #721c24;
+}
+
+.json-section {
+    margin: 2rem 0;
+}
+
+.json-toggle {
+    background-color: #f8f9fa;
+    border: 1px solid #dee2e6;
+    border-radius: 0.375rem 0.375rem 0 0;
+    padding: 1rem;
+    cursor: pointer;
+    user-select: none;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    font-weight: 500;
+}
+
+.json-toggle:hover {
+    background-color: #e9ecef;
+}
+
+.json-toggle::after {
+    content: "▼";
+    transition: transform 0.2s ease;
+}
+
+.json-toggle.collapsed::after {
+    transform: rotate(-90deg);
+}
+
+.json-content {
+    border: 1px solid #dee2e6;
+    border-top: none;
+    border-radius: 0 0 0.375rem 0.375rem;
+    background-color: #fff;
+    max-height: 400px;
+    overflow: hidden;
+    transition: max-height 0.3s ease;
+}
+
+.json-content.collapsed {
+    max-height: 0;
+}
+
+.json-textarea {
+    width: 100%;
+    border: none;
+    padding: 1rem;
+    font-family: 'Courier New', monospace;
+    font-size: 0.875rem;
+    line-height: 1.4;
+    resize: vertical;
+    min-height: 300px;
+    background-color: #f8f9fa;
+}
+
+.action-buttons {
+    margin-top: 2rem;
+    display: flex;
+    gap: 1rem;
+    flex-wrap: wrap;
+}
+
+.btn {
+    padding: 0.75rem 1.5rem;
+    border: none;
+    border-radius: 0.375rem;
+    font-size: 1rem;
+    cursor: pointer;
+    text-decoration: none;
+    display: inline-block;
+    text-align: center;
+}
+
+.btn-primary {
+    background-color: #0d6efd;
+    color: white;
+}
+
+.btn-primary:hover {
+    background-color: #0b5ed7;
+}
+
+.btn-secondary {
+    background-color: #6c757d;
+    color: white;
+}
+
+.btn-secondary:hover {
+    background-color: #5c636a;
+}
+
+.error-details {
+    background-color: #fff3cd;
+    border: 1px solid #ffeaa7;
+    border-radius: 0.375rem;
+    padding: 1rem;
+    margin-bottom: 1rem;
+}
+
+.error-details h3 {
+    color: #856404;
+    margin: 0 0 0.5rem 0;
+}
+
+.error-details p {
+    color: #856404;
+    margin: 0;
+}

+ 73 - 0
src/main/resources/static/js/fehler.js

@@ -0,0 +1,73 @@
+function toggleJson(jsonId) {
+    const content = document.getElementById(jsonId + 'Content');
+    const toggle = content.previousElementSibling;
+    
+    content.classList.toggle('collapsed');
+    toggle.classList.toggle('collapsed');
+}
+
+function copyErrorReport() {
+    let report = 'FEHLERBERICHT\n';
+    report += '===============\n\n';
+    
+    // Schema-Fehler
+    const schemaErrors = document.querySelectorAll('.error-list:has(h3:contains("Schema-Validierungsfehler")) li');
+    if (schemaErrors.length > 0) {
+        report += 'Schema-Validierungsfehler:\n';
+        schemaErrors.forEach(error => {
+            report += '- ' + error.textContent + '\n';
+        });
+        report += '\n';
+    }
+    
+    // Parameter-Fehler
+    const paramErrors = document.querySelectorAll('.error-list:has(h3:contains("Parameter-Fehler")) li');
+    if (paramErrors.length > 0) {
+        report += 'Parameter-Fehler:\n';
+        paramErrors.forEach(error => {
+            report += '- ' + error.textContent + '\n';
+        });
+        report += '\n';
+    }
+    
+    // Verarbeitungsfehler
+    const procErrors = document.querySelectorAll('.error-list:has(h3:contains("Verarbeitungsfehler")) li');
+    if (procErrors.length > 0) {
+        report += 'Verarbeitungsfehler:\n';
+        procErrors.forEach(error => {
+            report += '- ' + error.textContent + '\n';
+        });
+        report += '\n';
+    }
+    
+    // Allgemeiner Fehler
+    const generalError = document.querySelector('.error-details p');
+    if (generalError) {
+        report += 'Allgemeiner Fehler:\n';
+        report += generalError.textContent + '\n\n';
+    }
+    
+    report += 'Zeitstempel: ' + new Date().toLocaleString() + '\n';
+    
+    navigator.clipboard.writeText(report).then(() => {
+        alert('Fehlerbericht in die Zwischenablage kopiert!');
+    }).catch(() => {
+        // Fallback für ältere Browser
+        const textArea = document.createElement('textarea');
+        textArea.value = report;
+        document.body.appendChild(textArea);
+        textArea.select();
+        document.execCommand('copy');
+        document.body.removeChild(textArea);
+        alert('Fehlerbericht in die Zwischenablage kopiert!');
+    });
+}
+
+// Initial: Beide JSON-Bereiche eingeklappt anzeigen
+window.addEventListener('load', function() {
+    const jsonContents = document.querySelectorAll('.json-content');
+    const jsonToggles = document.querySelectorAll('.json-toggle');
+    
+    jsonContents.forEach(content => content.classList.add('collapsed'));
+    jsonToggles.forEach(toggle => toggle.classList.add('collapsed'));
+});

+ 70 - 0
src/main/resources/templates/fehler.html

@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html lang="de" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8"/>
+    <title>Fehler - Vergleich</title>
+    <link rel="stylesheet" href="/css/global.css"/>
+    <link rel="stylesheet" href="/css/header.css"/>
+    <link rel="stylesheet" href="/css/legend.css"/>
+    <link rel="stylesheet" href="/css/fehler.css"/>
+</head>
+<body>
+    <div class="error-container">
+        <div class="error-header">
+            <h1>Fehler bei der Verarbeitung</h1>
+            <p>Bei der Verarbeitung Ihrer Anfrage sind Fehler aufgetreten. Bitte überprüfen Sie die JSON-Daten und versuchen Sie es erneut.</p>
+            
+            <div th:if="${schemaErrors != null and not #lists.isEmpty(schemaErrors)}" class="error-list">
+                <h3>Schema-Validierungsfehler:</h3>
+                <ul>
+                    <li th:each="error : ${schemaErrors}" th:text="${error}"></li>
+                </ul>
+            </div>
+            
+            <div th:if="${parameterErrors != null and not #lists.isEmpty(parameterErrors)}" class="error-list">
+                <h3>Parameter-Fehler:</h3>
+                <ul>
+                    <li th:each="error : ${parameterErrors}" th:text="${error}"></li>
+                </ul>
+            </div>
+            
+            <div th:if="${processingErrors != null and not #lists.isEmpty(processingErrors)}" class="error-list">
+                <h3>Verarbeitungsfehler:</h3>
+                <ul>
+                    <li th:each="error : ${processingErrors}" th:text="${error}"></li>
+                </ul>
+            </div>
+            
+            <div th:if="${generalError != null}" class="error-details">
+                <h3>Allgemeiner Fehler:</h3>
+                <p th:text="${generalError}"></p>
+            </div>
+        </div>
+        
+        <div th:if="${leftJson != null}" class="json-section">
+            <div class="json-toggle" onclick="toggleJson('leftJson')">
+                <span>📄 Left JSON (Basis/Alt)</span>
+            </div>
+            <div id="leftJsonContent" class="json-content">
+                <textarea class="json-textarea" readonly th:text="${leftJson}"></textarea>
+            </div>
+        </div>
+        
+        <div th:if="${rightJson != null}" class="json-section">
+            <div class="json-toggle" onclick="toggleJson('rightJson')">
+                <span>📄 Right JSON (Neu/Wahrheit)</span>
+            </div>
+            <div id="rightJsonContent" class="json-content">
+                <textarea class="json-textarea" readonly th:text="${rightJson}"></textarea>
+            </div>
+        </div>
+        
+        <div class="action-buttons">
+            <a href="/test" class="btn btn-primary">🔙 Zurück zur Testseite</a>
+            <button type="button" class="btn btn-secondary" onclick="copyErrorReport()">📋 Fehlerbericht kopieren</button>
+        </div>
+    </div>
+    
+    <script src="/js/fehler.js"></script>
+</body>
+</html>

+ 0 - 6
src/main/resources/templates/test.html

@@ -14,12 +14,6 @@
     <button type="button" onclick="loadExamples()">📄 Beispiel-JSONs laden</button>
     <button type="button" onclick="clearTextareas()">🗑️ Leeren</button>
   </div>
-  
-  <div th:if="${schemaErrors != null}" class="error-box">
-    <strong>Schema-Fehler</strong>
-    <ul><li th:each="e : ${schemaErrors}" th:text="${e}"></li></ul>
-  </div>
-
   <form method="post" id="mainForm" action="/hhm-einkommen" class="grid-2">
     <div><label>Left JSON (Basis/Alt)</label><textarea id="leftJson" name="leftJson" th:text="${leftJson}" rows="20"></textarea></div>
     <div><label>Right JSON (Neu/Wahrheit)</label><textarea id="rightJson" name="rightJson" th:text="${rightJson}" rows="20"></textarea></div>