Внутреннее поле Enum как параметр оператора Spring Data @Query

У меня есть перечисление с внутренним значением:

public enum Test {
    A("a");

    private String value;
    Test(String value) {
         this.value = value;
    }

    @Override
    public String toString() {
         return this.value;
    }
}

И я использую его как параметр в Spring Data Cassandra @Query. Также я добавил конвертер чтения и записи только для разбора "a" -> A и обратно. Я ожидал, что если я отправлю A в качестве параметра, запрос будет сгенерирован конвертерами. Но запрос был похож на «... my_enum = 'A'» вместо «a».

Я пытался отладить источники Spring и нашел эту часть кода org/springframework/data/spring-data-cassandra/1.5.9.RELEASE/spring-data-cassandra-1.5.9.RELEASE-sources.jar!/org/ springframework/data/cassandra/convert/MappingCassandraConverter.java:799:

    // Cassandra has no default enum handling - convert it either to string
    // or - if requested - to a different type
    if (Enum.class.isAssignableFrom(value.getClass())) {
        if (requestedTargetType != null && !requestedTargetType.isEnum()
                && getConversionService().canConvert(value.getClass(), requestedTargetType)) {

            return getConversionService().convert(value, requestedTargetType);
        }

        return ((Enum<?>) value).name();
    }

Похоже, если параметр enum - конвертеры никогда не будут использоваться. Как я могу справиться с этим? Спасибо.


person DamienMiheev    schedule 24.01.2018    source источник
comment
Одним из очевидных обходных путей было бы отправить A.toSring() вместо всех A. Но я предполагаю, что вы ищете более автоматический способ преобразования...   -  person Jos    schedule 24.01.2018
comment
Раньше я не использовал Spring data cassandra, но если мы используем только драйвер cassandra (из datastax), то нам нужно добавить собственный кодек для Enum. Пожалуйста, взгляните на ответ, который я разместил здесь ранее «кодек cassandra codecnotfoundexception не найден для запрошенной операции»> stackoverflow.com/questions/47996457/. Если возможно, зарегистрируйте собственный кодек для enum, а также в части конфигурации spring-data-cassandra и посмотрите, работает ли он.   -  person sayboras    schedule 25.01.2018
comment
Джос Энджел Джордж: Конечно, это самый простой способ. Просто ищу более пружинистый способ. @Apolozeus: На самом деле регистрация кодеков работает очень хорошо, если используется Session.execute(QueryBuilder.(...).build()); Я делаю то же самое, если мне нужно выполнить какой-то запрос вместо репозитория данных Spring. Более того, для включения отображения внутри данных Spring я регистрирую ReadingConverter и WrittingConvertera как оболочку в кодеке. И он отлично работает вместо этого случая с Enum.   -  person DamienMiheev    schedule 25.01.2018
comment
Это ошибка. Я создал jira.spring.io/browse/DATACASS-521.   -  person mp911de    schedule 25.01.2018
comment
@ mp911de спасибо обоим, приятно знать. Я также буду использовать данные cassandra spring в следующем проекте.   -  person sayboras    schedule 25.01.2018