diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/settings/UserSettings.java b/common/data/src/main/java/org/thingsboard/server/common/data/settings/UserSettings.java
index 79556080ff..0956c256a3 100644
--- a/common/data/src/main/java/org/thingsboard/server/common/data/settings/UserSettings.java
+++ b/common/data/src/main/java/org/thingsboard/server/common/data/settings/UserSettings.java
@@ -19,6 +19,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import lombok.ToString;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.validation.Length;
import org.thingsboard.server.common.data.validation.NoXss;
@@ -48,6 +49,7 @@ public class UserSettings implements Serializable {
private transient JsonNode settings;
@JsonIgnore
+ @ToString.Exclude
private byte[] settingsBytes;
public JsonNode getSettings() {
diff --git a/dao/pom.xml b/dao/pom.xml
index cc34d77c85..40421094f0 100644
--- a/dao/pom.xml
+++ b/dao/pom.xml
@@ -238,7 +238,7 @@
io.hypersistence
- hypersistence-utils-hibernate-62
+ hypersistence-utils-hibernate-63
org.apache.xmlgraphics
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserSettingsDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserSettingsDao.java
index 52a78c41fe..73b616e7ba 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserSettingsDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserSettingsDao.java
@@ -40,6 +40,7 @@ public class JpaUserSettingsDao extends JpaAbstractDaoListeningExecutorService i
@Override
public UserSettings save(TenantId tenantId, UserSettings userSettings) {
+ log.trace("save [{}][{}]", tenantId, userSettings);
return DaoUtil.getData(userSettingsRepository.save(new UserSettingsEntity(userSettings)));
}
@@ -55,6 +56,7 @@ public class JpaUserSettingsDao extends JpaAbstractDaoListeningExecutorService i
@Override
public List findByTypeAndPath(TenantId tenantId, UserSettingsType type, String... path) {
+ log.trace("findByTypeAndPath [{}][{}][{}]", tenantId, type, path);
return DaoUtil.convertDataList(userSettingsRepository.findByTypeAndPathExisting(type.name(), path));
}
diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserSettingsDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserSettingsDaoTest.java
index bf30ebb83b..2151f728d0 100644
--- a/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserSettingsDaoTest.java
+++ b/dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserSettingsDaoTest.java
@@ -16,6 +16,7 @@
package org.thingsboard.server.dao.sql.user;
import com.datastax.oss.driver.api.core.uuid.Uuids;
+import lombok.extern.slf4j.Slf4j;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -37,11 +38,14 @@ import org.thingsboard.server.dao.user.UserSettingsDao;
import java.util.UUID;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.data.Index.atIndex;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
import static org.thingsboard.server.dao.service.AbstractServiceTest.SYSTEM_TENANT_ID;
+@Slf4j
public class JpaUserSettingsDaoTest extends AbstractJpaDaoTest {
private UUID tenantId;
@@ -77,6 +81,34 @@ public class JpaUserSettingsDaoTest extends AbstractJpaDaoTest {
assertNull(retrievedUserSettings2);
}
+ // If Hibernate fail to bind JSON path please check the hypersistence-utils-hibernate-XX artifact name and version in the dependency management
+ // Example: java.lang.ClassCastException: class [Ljava.lang.String; cannot be cast to class [B ([Ljava.lang.String; and [B are in module java.base of loader 'bootstrap')
+ @Test
+ public void testFindByTypeAndJsonPath() {
+ UserSettings userSettings = createUserSettings(user.getId());
+ log.warn("userSettings {}", userSettings);
+
+ userSettings.setSettings(JacksonUtil.toJsonNode("{\"text\":\"bla1\",\"sessions\":{\"tenantFcmToken\":{\"fcmTokenTimestamp\":0}}}"));
+
+ userSettingsDao.save(SYSTEM_TENANT_ID, userSettings);
+
+ assertThat(userSettingsDao.findByTypeAndPath(SYSTEM_TENANT_ID, UserSettingsType.GENERAL, "text"))
+ .isNotEmpty().hasSize(1).contains(userSettings, atIndex(0));
+
+ assertThat(userSettingsDao.findByTypeAndPath(SYSTEM_TENANT_ID, UserSettingsType.GENERAL, "sessions", "tenantFcmToken"))
+ .isNotEmpty().hasSize(1).contains(userSettings, atIndex(0));
+
+ assertThat(userSettingsDao.findByTypeAndPath(user.getTenantId(), UserSettingsType.GENERAL, "mistery")).isEmpty();
+ assertThat(userSettingsDao.findByTypeAndPath(user.getTenantId(), UserSettingsType.GENERAL, "text", "text")).isEmpty();
+ assertThat(userSettingsDao.findByTypeAndPath(user.getTenantId(), UserSettingsType.GENERAL, "text", "lvl2")).isEmpty();
+ assertThat(userSettingsDao.findByTypeAndPath(user.getTenantId(), UserSettingsType.MOBILE, "text")).isEmpty();
+ assertThat(userSettingsDao.findByTypeAndPath(user.getTenantId(), UserSettingsType.MOBILE, "sessions", "1")).isEmpty();
+ assertThat(userSettingsDao.findByTypeAndPath(user.getTenantId(), UserSettingsType.MOBILE, "text", "text")).isEmpty();
+ assertThat(userSettingsDao.findByTypeAndPath(user.getTenantId(), UserSettingsType.MOBILE, "")).isEmpty();
+ assertThat(userSettingsDao.findByTypeAndPath(user.getTenantId(), UserSettingsType.MOBILE, null)).isEmpty();
+ assertThat(userSettingsDao.findByTypeAndPath(user.getTenantId(), UserSettingsType.MOBILE)).isEmpty();
+ }
+
private UserSettings createUserSettings(UserId userId) {
UserSettings userSettings = new UserSettings();
userSettings.setType(UserSettingsType.GENERAL);
diff --git a/pom.xml b/pom.xml
index 36d0d9dc71..2130dbb53d 100755
--- a/pom.xml
+++ b/pom.xml
@@ -127,7 +127,7 @@
3.7.1
10.1.3
8.0.1.Final
- 3.7.3
+ 3.7.4
4.0.2
3.0.2
1.7.5
@@ -2034,7 +2034,7 @@
io.hypersistence
- hypersistence-utils-hibernate-62
+ hypersistence-utils-hibernate-63
${hypersistence-utils.version}