Преобразование null в какое-либо значение в Spring Converter - PullRequest
7 голосов
/ 25 мая 2020

База данных (Cassandra) не позволяет указывать значение по умолчанию при добавлении новых столбцов. Таким образом, новые столбцы - null для каждой строки.

Теперь мы добавили флаг в нашу сущность (которая может получить больше записей в будущем):

enum UsageFlag {
    OTHER,
    SPECIAL_VALUE,
}

Мы также добавили ReadingConverter:

@ReadingConverter
public class UsageFlagReadingConverter implements Converter<String, UsageFlag> {
  @Nonnull
  @Override
  public UsageFlag convert(String source) {
    return source == null
        ? UsageFlag.OTHER
        : UsageFlag.valueOf(source);
  }
}

Он должен в основном обрабатывать null как UsageFlag.OTHER при анализе любого другого ненулевого значения как члена перечисления.

Однако это не работает, поскольку, согласно в документации Spring метод convert конвертера вызывается только в том случае, если значение равно , а не null. Из-за этого поле этой сущности остается null, если оно равно null в базе данных. Он отлично работает , если (и только если) есть значение. Поскольку при его создании весь столбец имеет значение NULL, это полностью противоречит цели ReadingConverter.

Кассандра, похоже, не поддерживает установку значения для каждой строки (например, UPDATE foo SET flag='OTHER' WHERE True), поэтому это выглядело как хороший вариант. Мы не хотели трогать каждую строку в базе данных вручную.

Есть ли способ использовать Spring, чтобы помочь в этой ситуации? Или есть способ решить эту проблему с помощью CQL или Cassandra?

Изменить: Еще один контекст в настройке:

public interface FancyEntityRepository extends MapIdCassandraRepository<FancyEntity> {
}

public class FancyEntity {
    @PrimaryKeyColumn(name = "id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private string id;
    private UsageFlag usage;
    // other columns omitted
    // getters and setter omitted for this example
}

// Somewhere in a service: 
FancyEntity fe = fancyEntityRepository.findOne("1");
System.out.println(fe.getUsage());

Но я не думаю, что поведение конвертера cassandra-specifici c.

Таблица была создана, а затем изменена следующим образом:

CREATE TABLE FancyEntity (
    id TEXT,
    -- other columns omitted
    PRIMARY KEY (id)
);
ALTER TABLE FancyEntity ADD (
    usage TEXT
);

Cassandra Docs на ALTER TABLE и связанный вопрос SO об изменении таблиц со значением по умолчанию .

...