Spring -data mongodb пользовательская реализация PropertyReferenceException

Я пытаюсь реализовать пользовательский запрос в соответствии с пользовательскими реализациями Reference 4.4:

http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/repositories.html

В чем разница между Spring Data MongoTemplate и MongoRepository?

Я делаю это, потому что мне нужны специальные запросы, используя mongoTemplate.

Я получаю ошибку PropertyReferenceException. Похоже, что spring -data пытается автогенерировать запрос, который я не хочу. Я хочу использовать свой собственный пользовательский запрос.

org.springframework.data.mapping.PropertyReferenceException: No property search found for type com.eerra.core.common.dto.User

Проблема также описывается здесь, но решение, похоже, не работает для меня:

http://forum.springsource.org/showthread.php?114454-Custom-repository-functionality

Вопрос

Как я могу реализовать свой пользовательский интерфейс и реализацию запроса без spring -data, пытаясь автоматически генерировать запрос?

Конфигурация

Spring Конфигурация

spring -data.xml

<!-- Spring Data MongoDB repository support -->
<mongo:repositories base-package="com.eerra.*.common.service" />

Классы и интерфейсы репозитория расположены в следующем пакете:

com.eerra.core.common.service.UserRepositoryInterface.java com.eerra.core.common.service.UserRepoistoryCustom.java(интерфейс) com.eerra.core.common.service.UserRepositoryCustomImpl.java(реализация)

UserRepositoryCustom.java

public interface UserRepositoryCustom {
    List<User> searchAllUsers();
}

UserRepositoryCustomImpl.java

public class UserRepositoryCustomImpl implements UserRepositoryCustom {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public List<User> searchAllUsers() {
        return mongoTemplate.findAll(User.class);
    }
}

UserRepositoryInterface.java

@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String>, UserRepositoryCustom {
    User findByEmail(String email);
    List<User> findByEmailLike(String email);
    List<User> findByEmailOrLastName(String email, String lastName);
    List<User> findByEmailOrFirstNameLike(String email, String firstName);

    @Query("{\"$or\" : [ { \"email\" : { \"$regex\" : ?0, \"$options\" : \"i\"}} , " +
        "{ \"firstName\" : { \"$regex\" : ?0, \"$options\" : \"i\"}}, " +
        "{ \"lastName\" : { \"$regex\" : ?0, \"$options\" : \"i\"}}]}")
    List<User> findByEmailOrFirstNameOrLastNameLike(String searchText);
}

Ответ 1

Проблема решена. Эта ошибка появляется, когда класс Impl назван неправильно. Класс Impl должен быть назван в соответствии с классом репозитория. Поэтому для этого примера должны быть имена:

  • com.eerra.core.common.service.UserRepositoryInterface.java(основной репозиторий)
  • com.eerra.core.common.service.UserRepositoryInterfaceImpl.java(реализация пользовательских методов репозитория)
  • com.eerra.core.common.service.UserRepositoryInterfaceCustom.java(интерфейс с пользовательскими методами)

См. ответ здесь: В чем разница между Spring Data MongoTemplate и MongoRepository?