2014-05-14 5 views
1

스프링 데이터 MongodB 1.4.2.Release 버전을 사용 중입니다. Spring Data MongoDB의 경우 사용자 정의 저장소 인터페이스와 구현을 한 위치에 만들고 사용자 정의 쿼리 함수 getUsersName(Users users)을 작성했습니다.스프링 데이터 MongoDB org.springframework.data.mapping.PropertyPath에서 유형에 대한 속성을 찾을 수 없습니다.

그러나 나는 아직도 예외 아래에 무엇입니까 :

Caused by: org.springframework.data.mapping.PropertyReferenceException: 
    No property get found for type Users! at org.springframework.data.mapping.PropertyPath.  (PropertyPath.java:75) at 
    org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327) at 
    org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:359) at 
    org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:359) at 
    org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307) at 
    org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:270) at 
    org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:241) at 
    org.springframework.data.repository.query.parser.Part.(Part.java:76) at 
    org.springframework.data.repository.query.parser.PartTree$OrPart.(PartTree.java:201) at 
    org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:291) at 
    org.springframework.data.repository.query.parser.PartTree$Predicate.(PartTree.java:271) at 
    org.springframework.data.repository.query.parser.PartTree.(PartTree.java:80) at 
    org.springframework.data.mongodb.repository.query.PartTreeMongoQuery.(PartTreeMongoQuery.java:47) 

아래는 내 봄 데이터 MongoDB의 구조입니다 :

 /* Users Domain Object */ 

     @Document(collection = "users") 
     public class Users { 

     @Id 
     private ObjectId id; 

     @Field ("last_name") 
     private String last_name; 

     @Field ("first_name") 
     private String first_name; 

     public String getLast_name() { 
      return last_name; 
     } 

     public void setLast_name(String last_name) { 
     this.last_name = last_name; 
    } 

     public String getFirst_name() { 
     return first_name; 
    } 

    public void setFirst_name(String first_name) { 
     this.first_name = first_name; 
    } 
} 

     /* UsersRepository.java main interface */ 

     @Repository 
     public interface UsersRepository extends MongoRepository<Users,String>, UsersRepositoryCustom { 

      List findUsersById(String id); 

     } 

     /* UsersRepositoryCustom.java custom interface */ 

     @Repository 
     public interface UsersRepositoryCustom { 

      List<Users> getUsersName(Users users); 
     } 

     /* UsersRepositoryImpl.java custom interface implementation */ 

     @Component 
     public class UsersRepositoryImpl implements UsersRepositoryCustom { 

     @Autowired 
     MongoOperations mongoOperations; 


     @Override 
     public List<Users> getUsersName(Users users) { 
      return mongoOperations.find(
        Query.query(Criteria.where("first_name").is(users.getFirst_name()).and("last_name").is(users.getLast_name())), Users.class); 
     } 

     /* Mongo Test function inside Spring JUnit Test class calling custom function with main UsersRepository interface */ 

     @Autowired 
     private UsersRepository usersRepository; 

     @Test 
     public void getUsersName() { 

      Users users = new Users(); 
      users.setFirst_name("James");`enter code here` 
      users.setLast_name("Oliver"); 
      List<Users> usersDetails = usersRepository.getUsersName(users); 
      System.out.println("users List" + usersDetails.size()); 


      Assert.assertTrue(usersDetails.size() > 0); 
     } 
+0

는 사용자 정의 저장소이 문서에 언급 된대로 작동하지 않습니다 - HTTP ://docs.spring.io/spring-data/data-mongo/docs/1.4.2.RELEASE/reference/html/repositories.html#repositories.custom-implementations – Navi

+0

작동합니다. 구현 클래스 이름이 올바르지 않은 것 같습니다. – Navi

답변

0

쿼리 메소드 선언 저장소 인터페이스 잘못되었습니다. reference documentation에 명시된 바와 같이 검색어 방법은 get…By, read_By, find…By 또는 query…by으로 시작해야합니다.

+0

Oliver에게 감사드립니다. 사용자 지정 메서드에 대한 쿼리 메서드 선언도 따라야합니다. searchBy로 시작하는 사용자 정의 메서드를 선언 할 수 있다고 생각했습니다. 위의 예제와 마찬가지로. getFirstName/setFirstName (String firstName)과 같은 도메인 클래스의 first_name 및 setter/getter 메서드와 같은 밑줄이있는 필드 이름이있는 경우 위의 경우에 사용자 지정 쿼리 메서드 선언을 사용해야합니다. – Navi

+0

올바른 대답을 수락하십시오 :). –

+0

밑줄이있는 필드 이름이 mongodb와 매핑 도메인 클래스에 모두있는 경우 사용자 정의 쿼리 메서드 선언이되어야합니다. – Navi

0

사용자 지정 리포지토리를 사용하면 Oliver가 설명한 것처럼 메서드 명명 규칙이 필요하지 않습니다. 나는 updateMessageCount라는 메서드로 작업하고있다.

그런데, 나는 여기에 제공된 코드로 문제를 볼 수 없다.

는 내가 제대로 내 IMPL 클래스를 명명되지 않은 여기이 게시물의 도움으로이 문제를 해결 :

No property found for type error when try to create custom repository with Spring Data JPA