2011-11-11 33 views
9

Dựa trên Spring Data Document documentation, tôi đã cung cấp triển khai tùy chỉnh phương thức lưu trữ. Tên phương pháp tùy chỉnh của đề cập đến một tài sản mà không tồn tại trong đối tượng miền:Dữ liệu mùa xuân MongoDB cố gắng tạo truy vấn cho các phương thức lưu trữ tùy chỉnh

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

Tuy nhiên, có lẽ vì tên phương pháp tôi đã chọn (findByNonExistentPropertyName), Spring dữ liệu cố gắng phân tích tên phương pháp, và tạo truy vấn từ nó. Khi không thể tìm thấy nonExistentProperty ở số User, một ngoại lệ sẽ bị loại bỏ.

độ phân giải có thể:

  1. đã tôi đã thực hiện một sai lầm trong cách tôi cung cấp việc thực hiện các phương pháp tùy chỉnh?
  2. Có cách nào để hướng dẫn Spring không tìm cách tạo truy vấn dựa trên tên của phương thức này không?
  3. Tôi có phải tránh sử dụng bất kỳ tiền tố nào mà Dữ liệu mùa xuân nhận ra không?
  4. Không có mục nào ở trên.

Cảm ơn bạn!

+0

Tôi không chắc đây có phải là sự cố thực sự hay không, nhưng không nên UserRepositoryCustomImpl triển khai UserRepositoryCustom? –

+0

Có, bạn nói đúng, và nó có, tôi chỉ bỏ lỡ khi viết câu hỏi. Cảm ơn bạn! –

Trả lời

10

Lớp triển khai của bạn phải được đặt tên là UserRepositoryImpl (nếu bạn dính vào cấu hình mặc định) khi chúng tôi cố gắng tìm kiếm nó dựa trên tên giao diện kho lưu trữ dữ liệu Spring đang được tìm thấy. Lý do chúng tôi bắt đầu với điều đó là chúng tôi không thể tin được một cách đáng tin cậy biết giao diện nào bạn mở rộng là giao diện có triển khai tùy chỉnh. Được cho một tình huống như thế này

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

chúng tôi sẽ phải mã hóa các giao diện không kiểm tra các lớp triển khai tùy chỉnh để ngăn chặn tình cờ pick-up.

Vì vậy, những gì chúng tôi thường đề xuất là đưa ra quy ước đặt tên giả sử hậu tố Custom cho giao diện chứa các phương pháp được triển khai thủ công. Sau đó bạn có thể thiết lập cơ sở hạ tầng kho để nhận lớp thực hiện sử dụng CustomImpl như hậu tố bằng repository-impl-postfix thuộc tính của repositories yếu tố:

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

Có thêm thông tin về điều đó trong reference documentation nhưng có vẻ như bạn có ít nhất một thời gian ngắn kiểm tra điều đó. :)

+0

Cảm ơn bạn rất nhiều! Tôi hoàn toàn bỏ lỡ rằng tên của việc thực hiện trong ví dụ không chứa 'Custom'. Vì tôi đã triển khai 'UserRepositoryCustom', tôi đã dự kiến ​​rằng Spring Data sẽ tìm kiếm một lớp có tên là' UserRepositoryCustomImpl', nhưng tôi có thể đánh giá mức độ khó thực hiện mà không yêu cầu người dùng cung cấp siêu dữ liệu bổ sung. Cảm ơn bạn và toàn bộ nhóm Spring Data để tạo ra một dự án tuyệt vời như vậy! –

+0

Bạn được chào đón nhiều nhất. Chúng tôi biết nó sẽ trực quan hơn một chút theo cách ban đầu bạn nghĩ về nó vì vậy tôi biết ơn bạn đã hỏi câu hỏi đó khi chúng tôi tạo ra một số điểm thông tin theo cách này :). –

Các vấn đề liên quan