How can I fix:
The dependencies of some of the beans in the application context form a cycle:
registrationController defined in file [C:\Users\31645\Desktop\Pastebin-Clone\target\classes\com\example\PastebinClone\controller\RegistrationController.class]
┌─────┐
| userService defined in file [C:\Users\31645\Desktop\Pastebin-Clone\target\classes\com\example\PastebinClone\service\UserService.class]
↑ ↓
| securityConfiguration defined in file [C:\Users\31645\Desktop\Pastebin-Clone\target\classes\com\example\PastebinClone\security\SecurityConfiguration.class]
└─────┘
Action:
Despite circular references being allowed, the dependency cycle between beans could not be broken. Update your application to remove the dependency cycle.
RegistrationController class
@Controller
class RegistrationController {
private final UserService userService;
private UserRepository userRepo;
public RegistrationController(UserService userService, UserRepository userRepo) {
this.userService = userService;
this.userRepo = userRepo;
}
@GetMapping("/index")
public String getUserPage() {
return "index";
}
@GetMapping("/login")
public String getUserLoginPage() {
if (isAuthenticated()) {
return "redirect:index";
}
return "loginUser";
}
@GetMapping("/register")
public String registerForm(Model model) {
model.addText("user");
return "registration";
}
@PostMapping("/process_register")
public String processRegistration(@Validated @ModelAttribute("user") Registration ro,
BindingResult result,
Model model) {
User tempUser = userRepo.findByEmail(ro.getEmail());
if (userRepo.findByEmail(ro.getEmail()) != null) {
result.rejectValue("email", null);
}
if (result.hasErrors()) {
model.addText("user");
return "registration";
}
userService.registerUser(ro);
return "paste";
}
private boolean isAuthenticated() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || AnonymousAuthenticationToken.class.isAssignableFrom(authentication.getClass())) {
return false;
}
return authentication.isAuthenticated();
}
UserService class
@Service
public class UserService {
private final UserRepository userRepo;
private BCryptPasswordEncoder passwordEncoder;
@Autowired
public UserService(UserRepository userRepo, BCryptPasswordEncoder passwordEncoder) {
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
}
public void registerUser(Registration ro) {
User user = new User();
user.setEmail(ro.getEmail());
user.setUsername(ro.getUsername());
user.setPassword(passwordEncoder.encode(ro.getPassword()));
userRepo.save(user);
}
}
SecurityConfiguration class
@Configuration
@EnableWebSecurity
public class SecurityConfiguration implements SpringSecurityConfig {
private final UserService userService;
@Autowired
public SecurityConfiguration(UserService userService) {
this.userService = userService;
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider auth = new DaoAuthenticationProvider();
auth.setUserDetailsService((UserDetailsService) userService);
auth.setPasswordEncoder(passwordEncoder());
return auth;
}
@Override
public void configure(AuthenticationManagerBuilder auth) {
auth.authenticationProvider(authenticationProvider());
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.dispatcherTypeMatchers(HttpMethod.valueOf("/registration"))
.permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.invalidateHttpSession(true)
.clearAuthentication(true)
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/login?logout")
.permitAll();
}
}
Any suggestion how to fix the dependency cycle?
What I have tried:
I tried with @Lazy annotation to final variables, also I tried to use constructor injection, which can help to break the circular dependency and it doesn't work.