This commit is contained in:
arys
2026-02-24 17:10:53 +05:00
parent cdb0eb6fe5
commit 94c3328282
@@ -12,11 +12,9 @@ import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.lang.NonNull;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
@Configuration
public class MongoConfig {
@@ -31,9 +29,30 @@ public class MongoConfig {
converters.add(new StringToMapConverter());
converters.add(new DocumentToMapConverter());
converters.add(new MapToStringConverter());
// ДОБАВИЛИ НАШ НОВЫЙ КОНВЕРТЕР СЮДА
converters.add(new StringToDoubleMongoConverter());
return new MongoCustomConversions(converters);
}
/**
* Конвертер для чтения: String -> Double
* Спасает от NumberFormatException, если в базе старый текст (например, "Средний")
*/
@ReadingConverter
public static class StringToDoubleMongoConverter implements Converter<String, Double> {
@Override
public Double convert(@NonNull String source) {
try {
return Double.parseDouble(source.trim());
} catch (NumberFormatException e) {
logger.warn("StringToDoubleMongoConverter: Не удалось преобразовать '{}' в Double. Возвращаем 0.0", source);
return 0.0;
}
}
}
/**
* Конвертер для чтения: String -> Map<String, Object>
* Обрабатывает случай, когда target_audience хранится как строка в MongoDB
@@ -52,7 +71,6 @@ public class MongoConfig {
}
try {
// Если это уже JSON строка, парсим её
if (source.trim().startsWith("{") || source.trim().startsWith("[")) {
logger.debug("StringToMapConverter: Parsing JSON string (starts with {} or [)",
source.trim().charAt(0));
@@ -66,7 +84,7 @@ public class MongoConfig {
int resultSize = result != null ? result.size() : 0;
logger.info("StringToMapConverter: Successfully parsed JSON string to Map. " +
"Source length: {} chars, Result size: {} keys, Parse duration: {} ms",
"Source length: {} chars, Result size: {} keys, Parse duration: {} ms",
sourceLength, resultSize, parseDuration);
if (parseDuration > 1000) {
@@ -85,7 +103,6 @@ public class MongoConfig {
return result;
}
// Если это простая строка, создаём пустой Map
logger.warn("StringToMapConverter: target_audience is a plain string, not JSON: {}", source);
return new HashMap<>();
} catch (Exception e) {
@@ -134,7 +151,6 @@ public class MongoConfig {
for (String key : source.keySet()) {
Object value = source.get(key);
// Рекурсивно конвертируем вложенные Document
if (value instanceof Document) {
nestedCount++;
logger.debug("DocumentToMapConverter: Found nested Document for key: {} at depth {}", key, depth);
@@ -142,7 +158,6 @@ public class MongoConfig {
} else if (value instanceof org.bson.types.BSONTimestamp ||
value instanceof org.bson.types.ObjectId ||
value instanceof java.util.Date) {
// Сохраняем специальные типы BSON как строки
result.put(key, value.toString());
} else {
result.put(key, value);
@@ -151,7 +166,7 @@ public class MongoConfig {
long duration = System.currentTimeMillis() - startTime;
logger.info("DocumentToMapConverter: Successfully converted Document to Map. " +
"Keys: {}, Nested documents: {}, Depth: {}, Duration: {} ms",
"Keys: {}, Nested documents: {}, Depth: {}, Duration: {} ms",
result.size(), nestedCount, depth, duration);
if (duration > 1000) {
@@ -207,4 +222,4 @@ public class MongoConfig {
}
}
}
}
}