2013-06-11 35 views
11

Tôi đang cố gắng để thực hiện một truy vấn tùy chỉnh theo Reference 4.4 Tuỳ chỉnh Triển khai:lò xo dữ liệu MongoDB tùy chỉnh thực hiện PropertyReferenceException

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

What's the difference between Spring Data's MongoTemplate and MongoRepository?

tôi đang làm điều này bởi vì tôi cần đặc biệt truy vấn bằng cách sử dụng mongoTemplate.

Lỗi tôi nhận được là một PropertyReferenceException. Vì vậy, có vẻ như dữ liệu mùa xuân đang cố gắng tự động tạo truy vấn mà tôi không muốn. Tôi muốn sử dụng truy vấn tùy chỉnh của riêng tôi.

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

Vấn đề được mô tả cũng ở đây nhưng giải pháp dường như không làm việc cho tôi:

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

Câu hỏi

Làm thế nào tôi có thể thực hiện giao diện truy vấn tùy chỉnh của tôi và thực hiện mà không có dữ liệu mùa xuân cố gắng tự động tạo truy vấn?

Cấu hình

Cấu hình mùa xuân

mùa xuân-data.xml

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

Các lớp Repository và giao diện đều nằm trong gói phần mềm sau đây:

com.eerra.core.common.service.UserRepositoryInterface.java com.eerra.core.common.service.UserRepoistoryCustom.java (giao diện) com.eerra.core.common.service.UserRepositoryCustomImpl.java (triển khai)

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); 
} 

Trả lời

24

Vấn đề được giải quyết. Lỗi này xuất hiện khi lớp Impl được đặt tên không chính xác. Lớp Impl phải được đặt tên theo lớp kho lưu trữ. Vì vậy, những tên tuổi có được sau ví dụ này:

  • com.eerra.core.common.service.UserRepositoryInterface.java (kho chính)
  • com.eerra.core.common.service.UserRepositoryInterfaceImpl.java (thực hiện các phương pháp kho tùy chỉnh)
  • com.eerra.core.common.service.UserRepositoryInterfaceCustom.java (giao diện với các phương pháp tùy chỉnh)

Xem câu trả lời ở đây: What's the difference between Spring Data's MongoTemplate and MongoRepository?