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 提供的依赖管理,除非有充分的理由不这样做。
所以我有一个 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 提供的依赖管理,除非有充分的理由不这样做。