Issue
I am new in Java Spring Boot. I am learning this through https://www.youtube.com/watch?v=XpMXAxDN7mY&list=PLoSpJpNZs-onHvM-sluFGIYSoFzSgw6n9&index=9&t=14s.
After trying to run the app. I've got error like this
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authController': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository' defined in com.example.SimpleSpringSecurityProject.models.UserRepository defined in @EnableMongoRepositories declared on MongoRepositoriesRegistrar.EnableMongoRepositoriesConfiguration: Cannot resolve reference to bean 'mongoTemplate' while setting bean property 'mongoOperations'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mongoTemplate' defined in class path resource [org/springframework/boot/autoconfigure/data/mongo/MongoDatabaseFactoryDependentConfiguration.class]: Unsatisfied dependency expressed through method 'mongoTemplate' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mongoDatabaseFactory' defined in class path resource [org/springframework/boot/autoconfigure/data/mongo/MongoDatabaseFactoryConfiguration.class]: Unsatisfied dependency expressed through method 'mongoDatabaseFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongo' defined in class path resource [org/springframework/boot/autoconfigure/mongo/MongoAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mongodb.client.MongoClient]: Factory method 'mongo' threw exception; nested exception is java.lang.IllegalArgumentException: The connection string is invalid. Connection strings must start with either 'mongodb://' or 'mongodb+srv:// at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
SimpleSpringSecurityProjectApplication.java (main)
package com.example.SimpleSpringSecurityProject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SimpleSpringSecurityProjectApplication {
public static void main(String[] args) {
SpringApplication.run(SimpleSpringSecurityProjectApplication.class, args);
}
}
UserModel.java
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "users")
public class UserModel {
@Id
private String id;
private String username;
private String password;
public UserModel() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
UserRepository.java
package com.example.SimpleSpringSecurityProject.models;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends MongoRepository<UserModel, String> {
UserModel findByUsername(String username);
}
SecurityConfiguration.java
package com.example.SimpleSpringSecurityProject.configurations;
import com.example.SimpleSpringSecurityProject.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().authorizeRequests().antMatchers("/subs", "/auth").permitAll().anyRequest().authenticated();
}
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
@Override
protected AuthenticationManager authenticationManager() throws Exception {
return super.authenticationManager();
}
}
AuthController.java
package com.example.SimpleSpringSecurityProject;
import com.example.SimpleSpringSecurityProject.models.AuthenticationRequest;
import com.example.SimpleSpringSecurityProject.models.AuthenticationResponse;
import com.example.SimpleSpringSecurityProject.models.UserModel;
import com.example.SimpleSpringSecurityProject.models.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AuthController {
@Autowired
private UserRepository userRepository;
@Autowired
private AuthenticationManager authenticationManager;
@PostMapping("/auth")
private ResponseEntity<?> authenticateClient(@RequestBody AuthenticationRequest authenticationRequest) {
String username = authenticationRequest.getUsername();
String password = authenticationRequest.getPassword();
try {
authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
} catch (BadCredentialsException ex) {
return ResponseEntity.ok(new AuthenticationResponse("Error during client authentication"));
}
return ResponseEntity.ok(new AuthenticationResponse("Client authenticated: " + username));
}
@PostMapping("/subs")
private ResponseEntity<?> subscribeClient(@RequestBody AuthenticationRequest authenticationRequest) {
String username = authenticationRequest.getUsername();
String password = authenticationRequest.getPassword();
UserModel userModel = new UserModel();
userModel.setUsername(username);
userModel.setPassword(password);
try {
userRepository.save(userModel);
} catch (Exception ex) {
return ResponseEntity.ok(new AuthenticationResponse("Subscribe Success for client: " + username));
}
return ResponseEntity.ok(new AuthenticationResponse("Subscribe Success for client: " + username));
}
}
application.properties
server.port=8682
spring.data.mongodb.uri="mongodb://localhost:27017/usersdb"
Can anyone help me? Thank you.
Solution
The errormessage is telling you everything you need to know:
[com.mongodb.client.MongoClient]: Factory method 'mongo' threw exception; nested exception is java.lang.IllegalArgumentException: The connection string is invalid. Connection strings must start with either 'mongodb://' or 'mongodb+srv:// at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
From what I found with a quick search, try this: spring.data.mongodb.uri=mongodb://localhost:27017/usersdb
Answered By - Nico
Answer Checked By - Gilberto Lyons (JavaFixing Admin)