首页 > 解决方案 > @RefreshScope 和 @Order

问题描述

我正在尝试使用@RefreshScopewith @Order。引导运行失败并出现错误

@Order on WebSecurityConfigurers must be unique. Order of 2147483636 was already used on com.company.rest.config.ActuatorSecurityConf$$EnhancerBySpringCGLIB$$1e7c9a55@6559faf1, so it cannot be used on com.company.rest.config.ActuatorSecurityConf$$EnhancerBySpringCGLIB$$1e7c9a55@6559faf1 too.

@RefreshScope使 bean 多次初始化,因为它使用代理。可以@RefreshScope@Order吗?

@Configuration
@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)
@RefreshScope
public class ActuatorSecurityConf extends WebSecurityConfigurerAdapter {

    private ApplicationProperties properties;

    public ActuatorSecurityConf(ApplicationProperties properties) {
        this.properties = properties;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // @formatter:off
        auth.inMemoryAuthentication()
            .withUser(properties.getActuatorUsername())
            .password(properties.getActuatorUserPassword())
            .roles("ACTUATOR");
        // @formatter:on
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.antMatcher("/manage/**")
                .csrf().disable()
                .cors()
            .and()
                .authorizeRequests()
                .antMatchers("/manage/info").permitAll()
                .anyRequest().hasRole("ACTUATOR")
            .and()
                .httpBasic();
        // @formatter:on
    }

}

更新:

@RefreshScope按照建议从中删除,@Configuration但错误仍然存​​在。

@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)需要将其WebSecurityConfigurerAdapter放在应用程序中的 另一个之前@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)

@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)
public class ActuatorSecurityConf extends WebSecurityConfigurerAdapter {
    private ApplicationProperties properties;

    @Autowired
    public ActuatorSecurityConf(ApplicationProperties properties) {
        this.properties = properties;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // same
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // same
    }
}

@Configuration
class ApplicationConfig {
    @Bean
    @RefreshScope
    public ApplicationProperties applicationProperties() {
        return new ApplicationProperties();
    }

    @Bean
    @RefreshScope
    public ActuatorSecurityConf actuatorSecurityConf() {
        return new ActuatorSecurityConf(applicationProperties());
    }
}

使用 Spring Boot 1.5.4.RELEASE

标签: spring-bootspring-cloud-config

解决方案


推荐阅读