diff --git a/api/pom.xml b/api/pom.xml
index fac019ab5..0c44d462e 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -29,6 +29,10 @@
org.springframework.boot
spring-boot-starter-security
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
org.springframework.boot
spring-boot-actuator
diff --git a/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java b/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java
index 5931602b2..e73029c4f 100644
--- a/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java
+++ b/api/src/main/java/io/kafbat/ui/config/ClustersProperties.java
@@ -2,6 +2,9 @@
import io.kafbat.ui.model.MetricsConfig;
import jakarta.annotation.PostConstruct;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -17,13 +20,15 @@
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
+import org.springframework.validation.annotation.Validated;
@Configuration
@ConfigurationProperties("kafka")
@Data
+@Validated
public class ClustersProperties {
- List clusters = new ArrayList<>();
+ List<@Valid Cluster> clusters = new ArrayList<>();
String internalTopicPrefix;
@@ -33,7 +38,9 @@ public class ClustersProperties {
@Data
public static class Cluster {
+ @NotBlank(message = "field name for for cluster could not be blank")
String name;
+ @NotBlank(message = "field bootstrapServers for for cluster could not be blank")
String bootstrapServers;
TruststoreConfig ssl;
@@ -46,9 +53,9 @@ public static class Cluster {
KsqldbServerAuth ksqldbServerAuth;
KeystoreConfig ksqldbServerSsl;
- List kafkaConnect;
+ List<@Valid ConnectCluster> kafkaConnect;
- List serde;
+ List<@Valid SerdeConfig> serde;
String defaultKeySerde;
String defaultValueSerde;
@@ -58,7 +65,7 @@ public static class Cluster {
Long pollingThrottleRate;
- List masking;
+ List<@Valid Masking> masking;
AuditProperties audit;
}
@@ -88,7 +95,9 @@ public static class MetricsConfigData {
@Builder(toBuilder = true)
@ToString(exclude = {"password", "keystorePassword"})
public static class ConnectCluster {
+ @NotBlank
String name;
+ @NotBlank
String address;
String username;
String password;
@@ -122,6 +131,7 @@ public static class KeystoreConfig {
@Data
public static class SerdeConfig {
+ @NotBlank
String name;
String className;
String filePath;
@@ -139,6 +149,7 @@ public static class KsqldbServerAuth {
@Data
public static class Masking {
+ @NotNull
Type type;
List fields;
String fieldsNamePattern;
@@ -160,7 +171,7 @@ public static class AuditProperties {
Integer auditTopicsPartitions;
Boolean topicAuditEnabled;
Boolean consoleAuditEnabled;
- LogLevel level;
+ LogLevel level = LogLevel.ALTER_ONLY;
Map auditTopicProperties;
public enum LogLevel {