Spring Data MongoDB пытается генерировать запросы для пользовательских методов хранилища

Основываясь на документации Spring Data Document, я предоставил пользовательскую реализацию метода хранилища. Имя пользовательского метода относится к свойству, которого нет в объекте домена:

@Document
public class User {
    String username;
}

public interface UserRepositoryCustom {
    public User findByNonExistentProperty(String arg);
}

public class UserRepositoryCustomImpl implements UserRepositoryCustom {
    @Override
    public User findByNonExistentProperty(String arg) {
        return /*perform query*/;
    }
}

public interface UserRepository
        extends CrudRepository<?, ?>, UserRepositoryCustom {

    public User findByUsername(String username);
}

Однако, возможно, из-за имени метода, который я выбрал (findByNonExistentPropertyName), Spring Data пытается проанализировать имя метода и создать из него запрос. Когда он не может найти nonExistentProperty в Userисключение.

Возможные решения:

  1. Я сделал ошибку в том, как я предоставляю реализацию пользовательского метода?
  2. Есть ли способ указать Spring не пытаться сгенерировать запрос на основе имени этого метода?
  3. Нужно ли просто избегать использования префиксов, которые распознает Spring Data?
  4. Ни один из вышеперечисленных.

Спасибо!

1 ответ

Решение

Ваш класс реализации должен быть назван UserRepositoryImpl (если вы придерживаетесь конфигурации по умолчанию), поскольку мы пытаемся найти ее на основе найденного имени интерфейса хранилища данных Spring. Причина, по которой мы начинаем с этого, состоит в том, что мы не можем достоверно знать, какой из интерфейсов, которые вы расширяете, является интерфейсом с пользовательской реализацией. Учитывая сценарий, как это

public interface UserRepository extends CrudRepository<User, BigInteger>,
  QueryDslPredicateExecutor<User>, UserRepositoryCustom { … }

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

Так что мы обычно предлагаем придумать соглашение об именах, скажем, Custom суффикс для интерфейса, содержащего методы, которые будут реализованы вручную. Затем вы можете настроить инфраструктуру репозитория для выбора классов реализации, используя CustomImpl в качестве суффикса, используя repository-impl-postfix атрибут repositories элемент:

<mongo:repositories base-package="com.acme" 
                    repository-impl-postfix="CustomImpl" />

В справочной документации об этом больше информации, но, кажется, вы хотя бы кратко проверили это.:)

Другие вопросы по тегам