From 209a52e8230eff61f08af87ac8e86517a7ae1668 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Wed, 28 Feb 2024 17:18:29 +0100
Subject: [PATCH] OZG-4949 Validation with Validator for nicer Errorresponse

---
 .../admin/settings/SettingsRepository.java    |  3 ---
 .../admin/settings/SettingsValidator.java     | 27 +++++++++++++++++++
 .../settings/ValidatorEventRegister.java      | 25 +++++++++++++++++
 3 files changed, 52 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/de/ozgcloud/admin/settings/SettingsValidator.java
 create mode 100644 src/main/java/de/ozgcloud/admin/settings/ValidatorEventRegister.java

diff --git a/src/main/java/de/ozgcloud/admin/settings/SettingsRepository.java b/src/main/java/de/ozgcloud/admin/settings/SettingsRepository.java
index e76feef8..bd0260c1 100644
--- a/src/main/java/de/ozgcloud/admin/settings/SettingsRepository.java
+++ b/src/main/java/de/ozgcloud/admin/settings/SettingsRepository.java
@@ -23,8 +23,6 @@ package de.ozgcloud.admin.settings;
 
 import java.util.List;
 
-import jakarta.validation.Valid;
-
 import org.springframework.data.mongodb.repository.MongoRepository;
 import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 import org.springframework.validation.annotation.Validated;
@@ -34,7 +32,6 @@ import org.springframework.validation.annotation.Validated;
 interface SettingsRepository extends MongoRepository<Settings, String> {
 
 	@Override
-	@Valid
 	Settings save(Settings entity);
 
 	List<Settings> findByName(String name);
diff --git a/src/main/java/de/ozgcloud/admin/settings/SettingsValidator.java b/src/main/java/de/ozgcloud/admin/settings/SettingsValidator.java
new file mode 100644
index 00000000..61676a05
--- /dev/null
+++ b/src/main/java/de/ozgcloud/admin/settings/SettingsValidator.java
@@ -0,0 +1,27 @@
+package de.ozgcloud.admin.settings;
+
+import jakarta.validation.ConstraintViolationException;
+import jakarta.validation.Validation;
+
+import org.springframework.stereotype.Component;
+import org.springframework.validation.Errors;
+import org.springframework.validation.Validator;
+
+@Component
+public class SettingsValidator implements Validator {
+
+	@Override
+	public boolean supports(Class<?> clazz) {
+		return Settings.class.equals(clazz);
+	}
+
+	@Override
+	public void validate(Object target, Errors errors) {
+		jakarta.validation.Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
+		var constraintViolations = validator.validate(target);
+		if (!constraintViolations.isEmpty()) {
+			throw new ConstraintViolationException(constraintViolations);
+		}
+	}
+
+}
diff --git a/src/main/java/de/ozgcloud/admin/settings/ValidatorEventRegister.java b/src/main/java/de/ozgcloud/admin/settings/ValidatorEventRegister.java
new file mode 100644
index 00000000..914a721b
--- /dev/null
+++ b/src/main/java/de/ozgcloud/admin/settings/ValidatorEventRegister.java
@@ -0,0 +1,25 @@
+package de.ozgcloud.admin.settings;
+
+import java.util.Map;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.rest.core.event.ValidatingRepositoryEventListener;
+import org.springframework.validation.Validator;
+
+@Configuration
+public class ValidatorEventRegister implements InitializingBean {
+
+	@Autowired
+	ValidatingRepositoryEventListener validatingRepositoryEventListener;
+
+	@Autowired
+	private Map<String, Validator> validators;
+
+	@Override
+	public void afterPropertiesSet() throws Exception {
+		validatingRepositoryEventListener.addValidator("beforeSave", validators.get("settingsValidator"));
+		validatingRepositoryEventListener.addValidator("beforeCreate", validators.get("settingsValidator"));
+	}
+}
\ No newline at end of file
-- 
GitLab