Java 将UserService注入jhipster中的SecurityConfiguration会导致Springbean循环依赖

Java 将UserService注入jhipster中的SecurityConfiguration会导致Springbean循环依赖,java,spring,jhipster,auth0,Java,Spring,Jhipster,Auth0,我正在尝试将jhipster 4应用程序配置为使用auth0进行auth。当我最初生成项目时,我选择了JWT选项,它似乎工作得很好,并提供了JWT支持。我现在要做的是正确地处理与auth0的集成,读取它们提供的JWT令牌,并在第一次看到新的auth0用户名时创建一个用户 为此,我计划将UserService注入jhipster提供的JWTFilter中,并在第一次看到用户名时创建一个新帐户: private UserService userService; public JWTFilter(T

我正在尝试将jhipster 4应用程序配置为使用auth0进行auth。当我最初生成项目时,我选择了JWT选项,它似乎工作得很好,并提供了JWT支持。我现在要做的是正确地处理与auth0的集成,读取它们提供的JWT令牌,并在第一次看到新的auth0用户名时创建一个用户

为此,我计划将
UserService
注入jhipster提供的
JWTFilter
中,并在第一次看到用户名时创建一个新帐户:

private UserService userService;

public JWTFilter(TokenProvider tokenProvider, UserRepository userRepository, UserService userService) {
    this.tokenProvider = tokenProvider;
    this.userRepository = userRepository;
    this.userService = userService;
}
为此,我必须将
UserService
添加到
JWTConfigurer
的构造函数中,并将
JWTFilter
配置为:

package com.proj.security.jwt;

import com.proj.repository.UserRepository;
import com.proj.service.UserService;
import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.DefaultSecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

public class JWTConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {

    public static final String AUTHORIZATION_HEADER = "Authorization";

    public static final String AUTHORIZATION_TOKEN = "access_token";

    private TokenProvider tokenProvider;

    private UserRepository userRepository;

    private UserService userService;

    public JWTConfigurer(TokenProvider tokenProvider, UserRepository userRepository, UserService userService) {
        this.tokenProvider = tokenProvider;
        this.userRepository = userRepository;
        this.userService = userService;
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        JWTFilter customFilter = new JWTFilter(tokenProvider, userRepository, userService);
        http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
    }
}
并添加到
JWTConfigurer
bean中

private JWTConfigurer securityConfigurerAdapter() {
    return new JWTConfigurer(tokenProvider, userRepository, userService);
}
但是,当我使用maven启动应用程序时,会出现以下错误:

2017-03-13 22:41:00.816  WARN 45420 --- [  restartedMain] o.s.boot.SpringApplication               : Error handling failed (Error creating bean with name 'delegatingApplicationListener' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cache.annotation.ProxyCachingConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available)
2017-03-13 22:41:00.823 ERROR 45420 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  securityConfiguration defined in file [/Users/user/work/proj/target/classes/com/proj/config/SecurityConfiguration.class]
↑     ↓
|  userService defined in file [/Users/user/work/proj/target/classes/com/proj/service/UserService.class]
└─────┘

UserService
没有注入
SecurityConfiguration
,因此我不确定如何克服这个问题。这个问题还有其他解决方法吗?

最后,我通过混合使用
SecurityConfiguration
类解决了这个问题:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private final AuthenticationManagerBuilder authenticationManagerBuilder;

    private final UserDetailsService userDetailsService;

    private UserRepository userRepository;

    private final TokenProvider tokenProvider;

    private final CorsFilter corsFilter;

    private UserService userService;

    public SecurityConfiguration(AuthenticationManagerBuilder authenticationManagerBuilder, UserDetailsService userDetailsService,
            TokenProvider tokenProvider, CorsFilter corsFilter, UserRepository userRepository) {

        this.authenticationManagerBuilder = authenticationManagerBuilder;
        this.userDetailsService = userDetailsService;
        this.tokenProvider = tokenProvider;
        this.corsFilter = corsFilter;
        this.userRepository = userRepository;
    }

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}
一旦我这样做了,我看到构造函数被正确的参数调用,然后
UserService
被构造,然后被注入
SecurityConfiguration
的setter中,正如我所希望的那样

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    private final AuthenticationManagerBuilder authenticationManagerBuilder;

    private final UserDetailsService userDetailsService;

    private UserRepository userRepository;

    private final TokenProvider tokenProvider;

    private final CorsFilter corsFilter;

    private UserService userService;

    public SecurityConfiguration(AuthenticationManagerBuilder authenticationManagerBuilder, UserDetailsService userDetailsService,
            TokenProvider tokenProvider, CorsFilter corsFilter, UserRepository userRepository) {

        this.authenticationManagerBuilder = authenticationManagerBuilder;
        this.userDetailsService = userDetailsService;
        this.tokenProvider = tokenProvider;
        this.corsFilter = corsFilter;
        this.userRepository = userRepository;
    }

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}