diff --git a/common/cluster-api/pom.xml b/common/cluster-api/pom.xml
index ee9c1eae75..75048197d3 100644
--- a/common/cluster-api/pom.xml
+++ b/common/cluster-api/pom.xml
@@ -60,10 +60,6 @@
jakarta.annotation
jakarta.annotation-api
-
- com.github.java-json-tools
- json-schema-validator
-
org.slf4j
slf4j-api
diff --git a/common/dao-api/pom.xml b/common/dao-api/pom.xml
index d7142e723d..d3027356c3 100644
--- a/common/dao-api/pom.xml
+++ b/common/dao-api/pom.xml
@@ -56,10 +56,6 @@
jakarta.annotation
jakarta.annotation-api
-
- com.github.java-json-tools
- json-schema-validator
-
org.slf4j
slf4j-api
diff --git a/dao/pom.xml b/dao/pom.xml
index f203343c89..9618c38386 100644
--- a/dao/pom.xml
+++ b/dao/pom.xml
@@ -59,6 +59,10 @@
org.thingsboard.common
util
+
+ com.networknt
+ json-schema-validator
+
org.slf4j
slf4j-api
diff --git a/dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java b/dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java
index 5acf1b0f97..2c5d6fb3c5 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/component/BaseComponentDescriptorService.java
@@ -16,10 +16,10 @@
package org.thingsboard.server.dao.component;
import com.fasterxml.jackson.databind.JsonNode;
-import com.github.fge.jsonschema.core.exceptions.ProcessingException;
-import com.github.fge.jsonschema.core.report.ProcessingReport;
-import com.github.fge.jsonschema.main.JsonSchemaFactory;
-import com.github.fge.jsonschema.main.JsonValidator;
+import com.networknt.schema.JsonSchema;
+import com.networknt.schema.JsonSchemaFactory;
+import com.networknt.schema.SpecVersion;
+import com.networknt.schema.ValidationMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -36,6 +36,7 @@ import org.thingsboard.server.dao.service.DataValidator;
import org.thingsboard.server.dao.service.Validator;
import java.util.Optional;
+import java.util.Set;
/**
* @author Andrew Shvayka
@@ -89,15 +90,18 @@ public class BaseComponentDescriptorService implements ComponentDescriptorServic
@Override
public boolean validate(TenantId tenantId, ComponentDescriptor component, JsonNode configuration) {
- JsonValidator validator = JsonSchemaFactory.byDefault().getValidator();
try {
if (!component.getConfigurationDescriptor().has("schema")) {
throw new DataValidationException("Configuration descriptor doesn't contain schema property!");
}
JsonNode configurationSchema = component.getConfigurationDescriptor().get("schema");
- ProcessingReport report = validator.validate(configurationSchema, configuration);
- return report.isSuccess();
- } catch (ProcessingException e) {
+
+ JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4);
+ JsonSchema schema = factory.getSchema(configurationSchema);
+
+ Set validationMessages = schema.validate(configuration);
+ return validationMessages.isEmpty();
+ } catch (Exception e) {
throw new IncorrectParameterException(e.getMessage(), e);
}
}
diff --git a/dao/src/test/java/org/thingsboard/server/dao/component/BaseComponentDescriptorServiceTest.java b/dao/src/test/java/org/thingsboard/server/dao/component/BaseComponentDescriptorServiceTest.java
new file mode 100644
index 0000000000..d76c11f708
--- /dev/null
+++ b/dao/src/test/java/org/thingsboard/server/dao/component/BaseComponentDescriptorServiceTest.java
@@ -0,0 +1,98 @@
+/**
+ * Copyright © 2016-2025 The Thingsboard Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.thingsboard.server.dao.component;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+import org.thingsboard.common.util.JacksonUtil;
+import org.thingsboard.server.common.data.id.TenantId;
+import org.thingsboard.server.common.data.plugin.ComponentClusteringMode;
+import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
+import org.thingsboard.server.common.data.plugin.ComponentScope;
+import org.thingsboard.server.common.data.plugin.ComponentType;
+import org.thingsboard.server.dao.exception.IncorrectParameterException;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class BaseComponentDescriptorServiceTest {
+
+ private BaseComponentDescriptorService service;
+ private ComponentDescriptor componentDescriptor;
+ private TenantId tenantId;
+
+ @BeforeEach
+ void setUp() {
+ service = Mockito.spy(BaseComponentDescriptorService.class);
+ tenantId = TenantId.SYS_TENANT_ID;
+
+ // Create a simple component descriptor
+ componentDescriptor = new ComponentDescriptor();
+ componentDescriptor.setType(ComponentType.ACTION);
+ componentDescriptor.setScope(ComponentScope.TENANT);
+ componentDescriptor.setClusteringMode(ComponentClusteringMode.ENABLED);
+ componentDescriptor.setName("Test Component");
+ componentDescriptor.setClazz("org.thingsboard.test.TestComponent");
+
+ // Create configuration descriptor with schema from JSON string
+ String configDescriptorJson = """
+ {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "testField": {
+ "type": "string"
+ }
+ },
+ "required": ["testField"]
+ }
+ }""";
+
+ componentDescriptor.setConfigurationDescriptor(JacksonUtil.toJsonNode(configDescriptorJson));
+ }
+
+ @Test
+ void testValidate() {
+ // Create valid configuration from JSON string
+ String validConfigJson = "{\"testField\": \"test value\"}";
+ JsonNode validConfig = JacksonUtil.toJsonNode(validConfigJson);
+
+ // Create invalid configuration (missing required field) from JSON string
+ String invalidConfigJson = "{}";
+ JsonNode invalidConfig = JacksonUtil.toJsonNode(invalidConfigJson);
+
+ // Test valid configuration
+ boolean validResult = service.validate(tenantId, componentDescriptor, validConfig);
+ assertTrue(validResult, "Valid configuration should pass validation");
+
+ // Test invalid configuration
+ boolean invalidResult = service.validate(tenantId, componentDescriptor, invalidConfig);
+ assertFalse(invalidResult, "Invalid configuration should fail validation");
+
+ // Test with component descriptor without schema
+ ComponentDescriptor noSchemaDescriptor = new ComponentDescriptor(componentDescriptor);
+ noSchemaDescriptor.setConfigurationDescriptor(JacksonUtil.toJsonNode("{}"));
+
+ // Should throw exception when schema is missing
+ assertThrows(IncorrectParameterException.class, () -> {
+ service.validate(tenantId, noSchemaDescriptor, validConfig);
+ }, "Should throw exception when schema is missing");
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index cd2078e70a..0260dc09be 100755
--- a/pom.xml
+++ b/pom.xml
@@ -75,7 +75,7 @@
2.17.2
1.7.0
4.4.0
- 2.2.14
+ 1.5.6
0.6.12
3.12.1
2.0.0-M15
@@ -1620,15 +1620,9 @@
${auth0-jwt.version}
- com.github.java-json-tools
+ com.networknt
json-schema-validator
${json-schema-validator.version}
-
-
- com.sun.mail
- mailapi
-
-
org.eclipse.leshan