我尝试运行this example但不使用Redis,而是使用我的本地MysqL服务器.
我编辑了这个春季启动应用程序,如下所示:
摇篮:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
}
}
apply plugin: 'spring-boot'
apply from: JAVA_GRADLE
//this 'if' statement is because I was getting error: Execution Failed for task ':samples:findbyusername:findMainClass'.
//> Could not find property 'main' on task ':samples:findbyusername:run'.
if (!hasProperty('mainClass')) {
ext.mainClass = 'sample.FindByUsernameApplication'
}
tasks.findByPath("artifactoryPublish")?.enabled = false
group = 'samples'
dependencies {
compile("org.springframework.boot:spring-boot-starter-jdbc:$springBootVersion")
compile group: 'MysqL',name: 'MysqL-connector-java',version: '6.0.2'
compile group: 'org.springframework.session',name: 'spring-session',version: '1.2.0.RELEASE'
compile project(':spring-session'),"org.springframework.boot:spring-boot-starter-web","org.springframework.boot:spring-boot-starter-thymeleaf","nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect","org.springframework.security:spring-security-web:$springSecurityVersion","org.springframework.security:spring-security-config:$springSecurityVersion","com.maxmind.geoip2:geoip2:2.3.1","org.apache.httpcomponents:httpclient"
testCompile "org.springframework.boot:spring-boot-starter-test","org.assertj:assertj-core:$assertjVersion"
integrationTestCompile gebDependencies,"org.spockframework:spock-spring:$spockVersion"
}
def reservePort() {
def socket = new ServerSocket(0)
def result = socket.localPort
socket.close()
result
}
application.properties
spring.datasource.url = jdbc:MysqL://localhost:3306/TEST?characterEncoding=UTF-8&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.driverClassName = com.MysqL.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=but
spring.thymeleaf.cache=false
spring.template.cache=false
HttpSessionConfig.java
@EnableJdbcHttpSession // <1>
public class HttpSessionConfig {
}
应用程序从tomcat开始,但是当我在浏览器中点击localhost时,我得到:
Whitelabel Error Page
This application has no explicit mapping for /error,so you are seeing this as a fallback.
Mon May 23 21:14:31 CEST 2016
There was an unexpected error (type=Internal Server Error,status=500).
PreparedStatementCallback; bad sql grammar [INSERT INTO SPRING_SESSION(SESSION_ID,CREATION_TIME,LAST_ACCESS_TIME,MAX_INACTIVE_INTERVAL,PRINCIPAL_NAME) VALUES (?,?,?)]; nested exception is java.sql.sqlSyntaxErrorException: Table 'test.spring_session' doesn't exist
我不记得读过关于手动创建这个表的任何内容所以我认为spring会为我处理它…
编辑:
我实际上尝试了manually create tables,然后应用程序运行正常.但我想我不应该手动这样做.
最佳答案
Spring Session附带了大多数主要RDBMS的数据库模式脚本(位于org.springframework.session.jdbc包中),但Spring Session JDBC支持的数据库表的创建需要由用户自己处理.
提供的脚本可以不受影响地使用,但是一些用户可以选择使用提供的脚本作为参考来修改它们以满足其特定需求.
一种选择是使用数据库迁移工具(如Flyway)来处理数据库表的创建.
由于您正在使用Spring Boot,因此您可能会有一个待处理的PR来添加对Spring Session JDBC模式的自动初始化的支持:https://github.com/spring-projects/spring-boot/pull/5879
如果文档误导您认为表应该由Spring Session自动创建,请考虑报告问题,以便我们可以在必要时更新文档:https://github.com/spring-projects/spring-session/issues