Click here to Skip to main content
15,881,281 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
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

Java
@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


Java
@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


Java
@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.
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900