Search code examples
javaspringmongodbspring-data-mongodb

Error creating bean with name 'memberSv' defined in com.example.accountproject.models.interfaces.MemberSv defined


I am a student studying java. I want to make a simple membership registration using Spring boot mongoDB, but an error occurs and I ask a question. my source code

  1. MemberDTO

     public class MemberDTO {
    
         @Id
         private String memberId;
         private String memberPwd;
         private String memberName;
         private String memberEName;
         private String memberCompany;
         private String memberPhone;
         private String memberZipCode;
         private String memberAddress;
         private String memberAddressDetail;
         private String memberAuth;
         @CreatedDate
         private Date createdDate;
     }
    
  2. MemberController

     @Controller
     @RequestMapping("/member")
     public class MemberController {
    
    
         @Autowired
         private MemberSv memberSv;
    
         @RequestMapping(value = "/join", method = RequestMethod.POST)
         public String membersave(MemberDTO memberDTO)
         {
             memberSv.membersave(memberDTO);
             return "join_form";
         }
     }
    
  3. MemberSv

     @Repository
     public interface MemberSv extends MongoRepository<MemberDTO, String> {
         MemberDTO membersave(MemberDTO memberDTO);
     }
    
  4. MemberSvImp

     @Service
     @Transactional
     public class MemberSvImp {
    
         @Autowired
         private MemberSv memberSv;
    
         public MemberDTO membersave(MemberDTO memberDTO) {
             return memberSv.save(memberDTO);
         }
     }
    
  5. Spring boot main method

     @EnableMongoRepositories(basePackageClasses =com.example.accountproject.models.interfaces.MemberSv.class)
     @SpringBootApplication
     public class AccountProjectApplication {
    
         public static void main(String[] args) {
             SpringApplication.run(AccountProjectApplication.class, args);
         }
     }
    
  6. Error

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberController': 
Unsatisfied dependency expressed through field 'memberSv'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'memberSv' defined in com.example.accountproject.models.interfaces.MemberSv defined in @EnableMongoRepositories declared on AccountProjectApplication:     Invocation of init method failed; 
nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract com.example.accountproject.documents.MemberDTO com.example.accountproject.models.interfaces.MemberSv.membersave(com.example.accountproje ct.documents.MemberDTO)! Reason: No property membersave found for type MemberDTO! Did you mean 'memberName'?; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property membersave found for type MemberDTO! Did you mean 'memberName'?

Solution

  • The first thing is you cannot save the MemberDTO as it is through MongoRepository. You need to persist the entity object rather than a POJO.

    You need to add a MongoDB configuration By annotating the configuration class with @EnableMongoRepositories

    And finally, you need to make sure that you have created a collection (the MongoDB equivalent of a table in SQL) in MongoDB to persists the Member Document (the MongoDB equivalent of a record in a table in SQL)

    1. MongoDB configuration class.
    @Configuration
    @EnableTransactionManagement
    @EnableMongoRepositories(basePackages = {"com.example.accountproject.models"})
    @PropertySource({"classpath:application.properties"})
    public class MongoDBConfiguration{
    
        @Value("${spring.data.mongodb.host}") // set host in application.properties file
        private String mongoHost; 
        
        @Value("${spring.data.mongodb.port}") // set port in application.properties file
        private int mongoPort;
        
        @Value("${spring.data.mongodb.database}") // set DB name in application.properties file
        private String mongoDatabase;
    
        @Value("${spring.data.mongodb.user}") // set user in application.properties file
        private String mongoUser;
    
        @Value("${spring.data.mongodb.password}") // set password in application.properties file
        private String mongoPassword;
    
        @Bean
        public MongoDbFactory mongoDbFactory() {
            MongoCredential mongoCredential = MongoCredential.createCredential(mongoUser, mongoDatabase, mongoPassword.toCharArray());
            ServerAddress serverAddress = new ServerAddress(mongoHost, mongoPort);
            MongoClient mongoClient = new MongoClient(serverAddress, Arrays.asList(mongoCredential));
            return new SimpleMongoDbFactory(mongoClient, mongoDatabase);
        }
    
        @Bean
        public MongoTemplate mongoTemplate(@Autowired MongoDbFactory mongoDbFactory) {
            MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory);
            return mongoTemplate;
        }
    }
    

    And remove the @EnableMongoRepositories Annotation in the AccountProjectApplication class

    1. introduce a new Model class for the Entity Member(Let's say the collection name is 'register')
     @Document(collection = 'register')
     public class Member{
         @Id
         private String memberId;
         private String memberPwd;
         private String memberName;
         private String memberEName;
         private String memberCompany;
         private String memberPhone;
         private String memberZipCode;
         private String memberAddress;
         private String memberAddressDetail;
         private String memberAuth;
         @CreatedDate
         private Date createdDate;
    
         //getters and setters
    
    }
    
    1. MemberController
     @Controller
     @RequestMapping("/member")
     public class MemberController {
    
    
         @Autowired
         private MemberSvImp memberService;
    
         @RequestMapping(value = "/join", method = RequestMethod.POST)
         public String membersave(MemberDTO memberDTO)
         {
             memberService.membersave(memberDTO);
             return "join_form";
         }
     }
    
    
    1. Service layer
    @Service 
    @Transactional 
    public class MemberSvImp {
    
        @Autowired
        private MemberSv memberSv;
    
        public Member membersave(MemberDTO memberDTO){
            Member member = new Member();
            //set member attributes through memberDTO
            //ex : member.setMemberName=memeberDTO.getMemeberName(); 
            return memberSv.save(member);
        }
    
    }
    
    1. Repository Class's Base Entity should be changed to Member
    @Repository
    public interface MemberSv extends MongoRepository<Member, String> {
        //you can call save(Entity) or saveAndFlush(Entity) of JPARespository directly without defining any custom methods to save new member. 
    }
    

    SUGGESTION : Better if you can rename the repository and service class to show their purpose

    MemberSv -> MemberRespository

    MemberSvImp - > MemberService