diff --git a/src/main/java/kz/konturai/parser/config/MongoConfig.java b/src/main/java/kz/konturai/parser/config/MongoConfig.java index fa5951d..caaeafa 100644 --- a/src/main/java/kz/konturai/parser/config/MongoConfig.java +++ b/src/main/java/kz/konturai/parser/config/MongoConfig.java @@ -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 { + @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 * Обрабатывает случай, когда 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 { } } } -} +} \ No newline at end of file