Connecting Spring boot to redis: NoClassDefFoundError: org/springframework/session/hazelcast/HazelcastFlushMode

Connecting Spring boot to redis: NoClassDefFoundError: org/springframework/session/hazelcast/HazelcastFlushMode

所以我有一个 spring 启动应用程序,我试图连接到 AWS 上托管的 redis 集群以进行会话 完整错误是:

  Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'spring.session-org.springframework.boot.autoconfigure.session.SessionProperties': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.session.SessionProperties]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/session/hazelcast/HazelcastFlushMode

在我的 build.gradle

buildscript {
ext {
    springBootVersion = '1.5.9.RELEASE'
}
repositories {
    mavenCentral()
}
dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
   }

  apply plugin: 'java'
  apply plugin: 'eclipse'
  apply plugin: 'org.springframework.boot'

   group = 'haughton.daniel'
  version = '0.0.1-SNAPSHOT'
  sourceCompatibility = 1.8

  repositories {
mavenCentral()
  }  


   ext {
springCloudVersion = 'Edgware.SR1'
     }
  processResources {
from ('.ebextensions/') {
    into '.ebextensions'
}
    }


   dependencies {

compile('org.springframework.boot:spring-boot-starter-data-jpa')

compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.0.0.RELEASE'

compile('org.springframework.boot:spring-boot-starter-jdbc')
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-thymeleaf')

compile group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity4', version: '2.1.2.RELEASE'

compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.6'

compile group: 'org.springframework.session', name: 'spring-session-data-redis', version: '2.0.2.RELEASE'


compile('org.springframework.boot:spring-boot-starter-web')
compile ('org.apache.tomcat:tomcat-dbcp:8.0.30')

runtime('mysql:mysql-connector-java')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.springframework.security:spring-security-test')
 }

 dependencyManagement {
imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
  }

在我的app.properties

 spring.session.store-type=redis
 spring.redis.host=my aws redis end point
 spring.redis.password=my password
 spring.redis.port=6379

我正在按照此处的指南进行操作https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot-redis.html#boot-how

我的安全配置

@EnableWebSecurity
@Configuration

public class SecurityConfiguration {
@Configuration
@Order(1)
public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserService userService;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        http
                .antMatcher("/api/**")
                .authorizeRequests()
                .antMatchers("/api/**").authenticated()
                .and()
                .httpBasic();
    }
    @Bean
    public EvaluationContextExtension securityExtension() {
        return new EvaluationContextExtensionSupport() {
            @Override
            public String getExtensionId() {
                return "security";
            }

            @Override
            public Object getRootObject() {
                Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
                return new SecurityExpressionRoot(authentication) {};
            }
        };
    }
}

@Configuration
@Order(2)
public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserService userService;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService);
    }



    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.authorizeRequests().antMatchers("/web/login",
                "/web/forgotPassword",
                "/web/forgotPassword/useToken","/web/forgotPassword/**",
                "/web/forgotPassword/useToken/**").permitAll().antMatchers("/web/**").

                authenticated().
                and()
                .formLogin()
                .loginPage("/web/login")
                .permitAll()
                .successHandler(loginSuccessHandler())
                .failureUrl("/web/login-error")
                .and()
                .logout()
                .logoutUrl("/web/logout")
                .logoutSuccessUrl("/web/login")
                .and().
                csrf().disable();;

    }

    public AuthenticationSuccessHandler loginSuccessHandler() {
        return (request, response, authentication) -> response.sendRedirect("/web");
    }


    @Bean
    public EvaluationContextExtension securityExtension() {
        return new EvaluationContextExtensionSupport() {
            @Override
            public String getExtensionId() {
                return "security";
            }

            @Override
            public Object getRootObject() {
                Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
                return new SecurityExpressionRoot(authentication) {};
            }
        };
    }

}
}

您使用的 Spring Boot 和 Spring Session 版本不兼容。

Spring Boot 1.5 与 Spring Session 1.3 对齐,如 dependency versions appendix of Spring Boot's reference manual. OTOH, Spring Boot 2.0 is aligned with Spring Session 2.0, as can be seen here.

中所示

您应该真正避免在构建脚本中使用显式依赖版本声明,并依赖 Spring Boot 提供的依赖管理,除非有充分的理由不这样做。