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
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;
}
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";
}
}
MemberSv
@Repository
public interface MemberSv extends MongoRepository<MemberDTO, String> {
MemberDTO membersave(MemberDTO memberDTO);
}
MemberSvImp
@Service
@Transactional
public class MemberSvImp {
@Autowired
private MemberSv memberSv;
public MemberDTO membersave(MemberDTO memberDTO) {
return memberSv.save(memberDTO);
}
}
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);
}
}
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'?
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)
@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
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
}
@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";
}
}
@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);
}
}
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