将下面显示的 2 个依赖项添加到我的应用程序后一切正常,我的会话数据被写入我的本地 redis 服务器,但是当我尝试指定 redis 服务器的不同地址时出现错误。我认为错误与一些依赖问题有关,但我不知道如何解决这个问题。
compile "org.springframework.boot:spring-boot-starter-data-redis-reactive:${springVersion}"
compile "org.springframework.session:spring-session-data-redis:${springVersion}"
启动时出错
java.lang.IllegalStateException: org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:64) 的 org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration.propertySourcesPlaceholderConfigurer 上的错误处理条件~[spring-boot- autoconfigure-2.0.2.RELEASE.jar:2.0.2.RELEASE] 在 org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108) ~[spring-context-5.0.6.RELEASE.jar:5.0 .6.RELEASE] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:180) ~[spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.context .annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:141) ~[spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.context.annotation.ConfigurationClassB eanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:117) ~[spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:328) ~ [spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在 org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:233) ~[spring-context-5.0.6.RELEASE. jar:5.0.6.RELEASE] 在 org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273) ~[spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在 org. springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93) ~[spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.context.support.AbstractApplication Context.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694) ~[spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) ~ [spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在 org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:61) ~[spring-boot-2.0. 2.RELEASE.jar:2.0.2.RELEASE] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE] 在 org .springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:327 ) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) [spring-boot-2.0.2.RELEASE.jar: 2.0.2.RELEASE] 在 org.springfr amework.boot.SpringApplication.run(SpringApplication.java:1243) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE] 在 pl.bk.pizza.store.Initializer.main(Initializer.java: 11) [classes/:na] 原因:java.lang.IllegalStateException: 无法从 ClassLoader [sun.misc.Launcher\(AppClassLoader@18b4aac2 自省类 \[org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration\] \] 在 org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:659) ~\[spring-core-5.0.6.RELEASE.jar:5.0.6.RELEASE\] 在 org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils .java:556) ~\[spring-core-5.0.6.RELEASE.jar:5.0.6.RELEASE\] at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:569) ~\[spring-core-5.0. 6.RELEASE.jar:5.0.6.RELEASE\] 在 org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:541) ~\[spring-core-5.0.6.RELEASE.jar:5.0.6.RELEASE\] 在org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods (ReflectionUtils.java:599)~\[spring-core-5.0.6.RELEASE.jar:5.0.6.RELEASE\] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:724)~\[ spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE\] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:665) ~\[spring-beans-5.0.6.RELEASE .jar:5.0.6.RELEASE\] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:633) ~\[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE\]在 org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1489) ~\[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE\] 在 org.springframework.beans.factory。 support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1012) ~\[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE\] at org.springframework.boot.aut oconfigure.condition.BeanTypeRegistry.addBeanTypeForNonAliasDefinition(BeanTypeRegistry.java:164) ~\[spring-boot-autoconfigure-2.0.2.RELEASE.jar:2.0.2.RELEASE\] at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry.addBeanType (BeanTypeRegistry.java:153) ~\[spring-boot-autoconfigure-2.0.2.RELEASE.jar:2.0.2.RELEASE\] at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry.updateTypesIfNecessary(BeanTypeRegistry.java:203) ~\[spring-boot-autoconfigure-2.0.2.RELEASE.jar:2.0.2.RELEASE\] at org.springframework.boot.autoconfigure.condition.BeanTypeRegistry.getNamesForType(BeanTypeRegistry.java:115) ~\[spring-boot-autoconfigure -2.0.2.RELEASE.jar:2.0.2.RELEASE\] 在 org.springframework.boot.autoconfigure.condition.OnBeanCondition.collectBeanNamesForType(OnBeanCondition.java:265) ~\[spring-boot-autoconfigure-2.0.2.RELEASE. jar:2.0.2.RELEASE\] 在 org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:254) ~\[spring-boot-autoconfigur e-2.0.2.RELEASE.jar:2.0.2.RELEASE\] 在 org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchingBeans(OnBeanCondition.java:196) ~\[spring-boot-autoconfigure-2.0.2.RELEASE .jar:2.0.2.RELEASE\] 在 org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchOutcome(OnBeanCondition.java:116) ~\[spring-boot-autoconfigure-2.0.2.RELEASE.jar:2.0.2. RELEASE\] at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47) ~\[spring-boot-autoconfigure-2.0.2.RELEASE.jar:2.0.2.RELEASE\] ... 17 常见帧省略原因:java.lang.NoClassDefFoundError: javax/servlet/Filter at java.lang.ClassLoader.defineClass1(Native Method) ~\[na:1.8.0-internal\] at java.lang.ClassLoader.defineClass(ClassLoader.java :763) ~\[na:1.8.0-internal\] at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~\[na:1.8.0-internal\] at java.net.URLClassLoader.defineClass(URLClassLoader.java :467) ~\[na:1.8.0-internal\] at java.net.URLClassLoad er.access\)100(URLClassLoader.java:73) ~[na:1.8.0-internal] at java.net.URLClassLoader\(1.run(URLClassLoader.java:368) ~\[na:1.8.0-internal\] at java. net.URLClassLoader\)1.run(URLClassLoader.java:362) ~[na:1.8.0-internal] at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0-internal] at java.net。 URLClassLoader.findClass(URLClassLoader.java:361) ~[na:1.8.0-internal] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0-internal] at sun.misc。 Launcher\(AppClassLoader.loadClass(Launcher.java:331) ~\[na:1.8.0-internal\] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~\[na:1.8.0-internal\] at java。 lang.ClassLoader.defineClass1(Native Method) ~\[na:1.8.0-internal\] at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~\[na:1.8.0-internal\] at java.security.SecureClassLoader .defineClass(SecureClassLoader.java:142) ~\[na:1.8.0-internal\] at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) ~\[na:1.8.0-internal\] at java.net.URLClassLoader .access\)100(UR LClassLoader.java:73) ~[na:1.8.0-internal] at java.net.URLClassLoader\(1.run(URLClassLoader.java:368) ~\[na:1.8.0-internal\] at java.net.URLClassLoader\)1。运行(URLClassLoader.java:362)[na:1.8.0-internal] at java.security.AccessController.doPrivileged(Native Method)[na:1.8.0-internal] at java.net.URLClassLoader.findClass(URLClassLoader .java:361) ~[na:1.8.0-internal] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0-internal] at sun.misc.Launcher\(AppClassLoader.loadClass (Launcher.java:331) ~\[na:1.8.0-internal\] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~\[na:1.8.0-internal\] at java.lang.Class.getDeclaredMethods0 (本机方法)~\[na:1.8.0-internal\] at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~\[na:1.8.0-internal\] at java.lang.Class.getDeclaredMethods(Class. java:1975) ~\[na:1.8.0-internal\] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:641) ~\[spring-core-5.0.6.RELEASE.jar:5.0.6.RELEASE \] ... 35个常用框架省略原因:java.lang.ClassNotFoundException:java.net.URLClassLoader.findClass(URLClassLoader.java:381) 处的 javax.servlet.Filter ~\[na:1.8.0-internal\] 处 java.lang.ClassLoader.loadClass(ClassLoader .java:424) ~\[na:1.8.0-internal\] at sun.misc.Launcher\)AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0-internal] at java.lang.ClassLoader.loadClass (ClassLoader.java:357) ~[na:1.8.0-internal] …省略了63个常用框架
RedisConfig
@Configuration
@EnableRedisHttpSession
public class RedisConfig
{
@Bean
LettuceConnectionFactory jedisConnectionFactory()
{
final RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName("redis-19999.c14.us-east-1-2.ec2.cloud.redislabs.com");
config.setPort(19999);
config.setPassword(RedisPassword.of("***"));
return new LettuceConnectionFactory();
}
}
build.gradle 文件
buildscript {
ext.springVersion = '2.0.2.RELEASE'
ext.gradleDocker = '1.2'
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath "se.transmode.gradle:gradle-docker:$gradleDocker"
classpath "org.springframework.boot:spring-boot-gradle-plugin:$springVersion"
}
}
plugins {
id "org.sonarqube" version "2.6.2"
}
apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'groovy'
apply plugin: 'org.springframework.boot'
apply plugin: 'docker'
apply plugin: 'jacoco'
dependencies {
// spring
compile "org.springframework.boot:spring-boot-starter-webflux:${springVersion}"
compile "org.springframework.boot:spring-boot-starter-data-mongodb-reactive:${springVersion}"
compile "org.springframework.boot:spring-boot-starter-security:${springVersion}"
testCompile "org.springframework.security:spring-security-test:${springSecurityTest}"
testCompile "org.springframework.boot:spring-boot-starter-test:${springVersion}"
compile "org.springframework.boot:spring-boot-starter-data-redis-reactive:${springVersion}"
compile "org.springframework.session:spring-session-data-redis:${springVersion}"
// utils
testCompile "org.assertj:assertj-core:${assertJ}"
compile "com.google.guava:guava:${guava}"
compile "io.projectreactor:reactor-core:${reactor}"
compile "io.reactivex.rxjava2:rxjava:${rxjava}"
compile "commons-lang:commons-lang:${commonsLang}"
compile "commons-validator:commons-validator:${commonsLangValidator}"
compileOnly "org.projectlombok:lombok:${lombok}"
// embedded mongo for tests
testCompile "de.flapdoodle.embed:de.flapdoodle.embed.mongo:${embeddedMongo}"
// spock
compile "org.codehaus.groovy:groovy-all:${groovy}"
testCompile "org.spockframework:spock-core:${spockCore}"
testCompile "org.spockframework:spock-spring:${spockSpring}"
}
原文由 bkubiak 发布,翻译遵循 CC BY-SA 4.0 许可协议
这里发生了几件事。
您提供的日志表明类路径中缺少
javax.servlet.Filter
而您的构建脚本和依赖项建议您构建 Spring WebFlux 应用程序。我怀疑这是由于您使用@EnableRedisHttpSession
明确配置 Spring Session 的 Servlet 支持(注意HttpSession
在那里?)而不是@EnableRedisWebSession
。更好的是,您应该将 Spring Session 配置留给 Spring Boot 以自动配置它 - 请参阅 Spring Boot 参考手册的 Spring Session 专用部分。同样的建议(避免显式配置,依赖自动配置)适用于您的 Redis 配置,即不需要显式
LettuceConnectionFactory
bean。此外,对于 Spring Boot,强烈建议使用它的依赖管理,而不是显式提供依赖的版本,至少对于 Spring Boot 的依赖管理所涵盖的依赖。请参阅 Boot 参考手册的 依赖管理 和 依赖版本附录 部分。最重要的是,您还应该强烈考虑使用 Boot 的启动器来确保所有必需的依赖项都被引入 - 请参阅 启动器专用部分。