#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, где находится реализация каждого пользовательского интерфейса.