Невозможно расширить пользовательский интерфейс репозитория с помощью spring data и репозитория mongodb

#java #spring #mongodb #spring-boot #spring-data

#java #spring #mongodb #spring-boot #spring-data

Вопрос:

Пользовательский интерфейс репозитория:

  public interface IUserRepository extends MongoRepository<User, Long>, IUserDAO {

 }
  

Пользовательский интерфейс DAO:

 public interface IUserDAO {

        List<User> query(String field, String val);
}
  

Реализация пользовательского DAO:

 @Repository
@Qualifier("UserDAO")
public class UserDAO implements IUserDAO {

    @Autowired
    private MongoTemplate mongoTemplate;


    @Override
    public List<User> query(String field, String val) {
        ....
    }

}
  

Пользовательский фасад:

 @Component
public class UsersFacade extends BaseFacade<User> implements IUsersFacade {

    static Logger logger = Logger.getLogger(UsersFacade.class.getName());

    @Autowired
    private IUserRepository usersRepository;



}
  

Пользователи:

 @Document(collection = "users")
public class User {

    @Id
    private String id;
    private String name;

    //getter 
    //setter
}
  

Это ошибка, которую я получаю:

Org.springframework.beans.factory.Исключение UnsatisfiedDependencyException: ошибка при создании компонента с именем ‘UsersController’: неудовлетворенная зависимость, выраженная через поле ‘usersFacade’; вложенным исключением является org.springframework.beans.factory.Исключение UnsatisfiedDependencyException: ошибка при создании компонента с именем ‘usersFacade’: неудовлетворенная зависимость, выраженная через поле ‘usersRepository’; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘IUserRepository’: не удалось вызвать метод init; вложенным исключением является org.springframework.data.mapping.Исключение PropertyReferenceException: Не найден запрос на свойство для типа User!

Приведенное выше сообщение об ошибке было изменено, если я меняю подпись, изменяя имя метода на query1, которое я получаю:

…. Не удалось вызвать метод init; вложенным исключением является org.springframework.data.mapping.Исключение PropertyReferenceException: Не найдено свойство query1 для типа User!

Я предполагаю, что по какой-то причине ожидается совпадение имени файла в пользователях с именем методов .. если я создаю файл в User.java именованный запрос, приложение запускается.

Чего мне здесь не хватает? я хотел бы использовать функциональность MongoRepository и добавить свои собственные пользовательские операции с репозиторием — чего мне здесь не хватает?

Спасибо!

Комментарии:

1. Вы не делаете этого, поскольку в документации объясняется, как это сделать: docs.spring.io/spring-data/mongodb/docs/current/reference/html /…

2. @JBNizet Хм … по вашей ссылке, пожалуйста, проверьте следующий раздел интерфейс UserRepository расширяет CrudRepository<Пользователь, длинный>, CustomizedUserRepository

3. У меня есть, и что? В документе большим прямоугольником выделено: «Наиболее важной частью имени класса, которая соответствует интерфейсу фрагмента, является Impl postfix.». Соблюдаете ли вы это правило?

4. Я говорю, что для предоставления пользовательских методов для репозитория интерфейс репозитория должен реализовать дополнительный интерфейс, определяющий эти пользовательские методы, а класс, реализующий этот интерфейс, должен иметь имя дополнительного интерфейса с постфиксом Impl . И это не должно быть помечено Repository . Короче говоря, вам нужно делать то, что указано в документации, что вы должны делать.

5. Ну, это просто соглашение, которому вы должны следовать, чтобы spring-data работал должным образом. Без такого соглашения вам нужно было бы каким-то образом сообщить spring-data, где находится реализация каждого пользовательского интерфейса.