代码之家  ›  专栏  ›  技术社区  ›  Daniel Haughton

将Spring boot连接到redis:NoClassDefFoundError:org/springframework/session/hazelcast/HazelcastFlushMode

  •  0
  • Daniel Haughton  · 技术社区  · 6 年前

    因此,我有一个spring boot应用程序,我正试图连接到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
    

    在我的构建中。格拉德尔

    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}"
    }
      }
    

    在我的应用程序中。属性

     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) {};
                }
            };
        }
    
    }
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Vedran Pavic    6 年前

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

    Spring Boot 1.5与Spring会话1.3对齐,如中所示 dependency versions appendix 《Spring Boot参考手册》。OTOH,Spring Boot 2.0与Spring Session 2.0一致,如图所示 here

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