2011-11-11 54 views
9

基於Spring Data Document documentation,我提供了一個存儲庫方法的自定義實現。自定義方法的名稱是指不在域對象存在的屬性:Spring Data MongoDB試圖爲自定義存儲庫方法生成查詢

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

然而,我所選擇的方法名(findByNonExistentPropertyName)或許是因爲,春數據嘗試解析方法名,並從中創建一個查詢。當它在User中找不到nonExistentProperty時,會引發異常。

可能的解決方法:

  1. 因爲我已在我如何提供自定義的方法的實現的錯誤呢?
  2. 有沒有辦法指示Spring不試圖根據此方法的名稱生成查詢?
  3. 我是否必須避免使用Spring Data可識別的任何前綴?
  4. 以上都不是。

謝謝!

+0

我不確定這是否是實際問題,但不應該UserRepositoryCustomImpl實現UserRepositoryCustom? –

+0

是的,你是對的,它確實如此,當我寫這個問題時,我錯過了。謝謝! –

回答

10

您的實現類被命名爲UserRepositoryImpl(如果你堅持到默認配置)當我們試圖根據被發現的春天數據倉庫接口的名字來關注一下吧。我們從這個開始的原因是,我們無法可靠地知道您擴展的哪個接口是自定義實現的接口。鑑於這樣的情況

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

我們必須以某種方式硬編碼接口不檢查自定義實現類以防止意外提取。

所以我們通常會提出一個命名約定,比如說包含要手動實現的方法的接口的後綴Custom。然後,您可以設置倉庫基礎設施使用repositories元素的repository-impl-postfix屬性回暖使用CustomImpl作爲後綴實現類:

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

reference documentation有關於它的更多信息,但似乎你至少有短暫檢查了。 :)

+0

非常感謝!我完全錯過了例子中的實現名稱不包含'Custom'。由於我正在實現'UserRepositoryCustom',我直觀地期望Spring Data會尋找一個名爲UserRepositoryCustomImpl的類,但是我可以理解這可能是多麼困難的實現,而不需要用戶提供額外的元數據。感謝你和整個Spring Data團隊創建這樣一個夢幻般的項目! –

+0

非常歡迎。我們知道它會更直觀一些,因爲我們通過這種方式創建了一些信息點,所以我很感謝您提出這個問題:)。 –

相關問題