2013-06-11 12 views
11

Ich versuche, eine benutzerdefinierte Abfrage nach dem Referenz 4.4 Benutzerdefinierte Implementierungen zu implementieren:feder Daten mongodb benutzerdefinierte Implementierung 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?

Ich tue dies, weil ich besondere brauchen Abfragen mit mongoTemplate.

Der Fehler, den ich bekomme, ist eine PropertyReferenceException. So scheint es, dass Spring-Daten versucht, die Abfrage automatisch zu generieren, die ich nicht will. Ich möchte meine eigene benutzerdefinierte Abfrage verwenden.

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

Das Problem ist auch hier beschrieben, aber die Lösung scheint nicht für mich zu arbeiten:

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

Frage

Wie kann ich meine benutzerdefinierte Abfrage-Schnittstelle implementieren und Implementierung ohne Spring-Daten versucht die Abfrage automatisch zu generieren?

Konfiguration

Federkonfiguration

feder data.xml

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

Die Repository-Klassen und Schnittstellen in folgendem Paket befinden:

com.eerra.core.common.service.UserRepositoryInterface.java com.eerra.core.common.service.UserRepoistoryCustom.java (Schnittstelle) com.eerra.core.common.service.UserRepositoryCustomImpl.java (Umsetzung)

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

Antwort

24

Das Problem ist gelöst. Dieser Fehler tritt auf, wenn die Impl-Klasse falsch benannt wird. Die Impl-Klasse muss entsprechend der Repository-Klasse benannt werden. So haben die Namen für dieses Beispiel folgende sein:

  • com.eerra.core.common.service.UserRepositoryInterface.java (Haupt-Repository)
  • com.eerra.core.common.service.UserRepositoryInterfaceImpl.java (Implementierung von Methoden benutzerdefinierten Repository)
  • com.eerra.core.common.service.UserRepositoryInterfaceCustom.java (Schnittstelle mit benutzerdefinierten Methoden)

die Antwort Siehe hier: What's the difference between Spring Data's MongoTemplate and MongoRepository?

Verwandte Themen