Пользовательский конвертер данных mongoDb и spring для поля enum - PullRequest
0 голосов
/ 18 мая 2018

У меня есть простой Java-класс под названием Metric, который имеет два поля: MetricType и значение:

public class Metric {
    MetricType type;
    int value;
}

enum MetricType {
    SPACE, CPU, UNKNOWN
}

При чтении метрики из mongo я хочу специальный преобразователь для MetricType, который будет преобразовывать все, что не являетсясопоставлено с enum to UNKNOWN.

Мой репозиторий является простым репозиторием:

public interface MetricRepository extends MongoRepository<Metric, 
String> {}

Я использую версию spring-boot-starter-data-mongodb 1.5.9

я попытался создать конвертер из строки в MetricType

@ReadingConverter
public class StringToMetricTypeConverter implements Converter<String, MetricType> {

    @Override
    public MetricType convert(String dbData) {
         try {
             return MetricType.valueOf(dbData);
         }
        catch (IllegalArgumentException e) {
            return MetricType.UNKNOWN;
        }
     }
 }

и добавить в файл mongoConfig:

@Bean
public MongoTemplate mongoTemplate() throws Exception {
    MongoTemplate mongoTemplate = new MongoTemplate(mongo(), getDatabaseName());
    MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
    mongoMapping.setCustomConversions(customConversions()); 
    mongoMapping.afterPropertiesSet();
    return mongoTemplate;
}

@Bean
public CustomConversions customConversions() {
    return new CustomConversions(Arrays.asList(new StringToMetricTypeConverter()));
}

Я вижу, что конвертер зарегистрирован в mongoTemplate, но конвертерне вызывается ... что мне здесь не хватает?

спасибо!

1 Ответ

0 голосов
/ 02 марта 2019

Можно попробовать использовать MongoCustomConversions вместо org.springframework.data.convert. CustomConversions .MongoCustomConversions является подклассом CustomConversions

Но идеальным вариантом было бы вообще не требовать каких-либо преобразований или чтобы преобразователь можно было настраивать внутри перечислений.

...