3

我正在尝试在 Spring Boot 应用程序中将 Spring Social 集成到 Spring Security 之上。但似乎 Spring Security 在创建默认表时遇到问题,例如 UserConnection、UserProfile 等,因为在成功建立与 oauth2 提供程序的连接后出现这些 SQL 错误:

PreparedStatementCallback; bad SQL grammar [select userId from UserConnection where providerId = ? and providerUserId = ?]; nested exception is org.h2.jdbc.JdbcSQLException: Tabelle "USERCONNECTION" nicht gefunden Table "USERCONNECTION" not found; SQL statement: select userId from UserConnection where providerId = ? and providerUserId = ? [42102-185]

这是 spring 提供的 JdbcUsersConnectionRepository 中的静态 SQL 调用。我试图切换到避免 SQL 问题的 InMemory 实现,但随后发生了下一个问题:

PreparedStatementCallback; bad SQL grammar [INSERT into userProfile(userId, email, firstName, lastName, name, username) values(?,?,?,?,?,?)]; nested exception is org.h2.jdbc.JdbcSQLException: Tabelle "USERPROFILE" nicht gefunden Table "USERPROFILE" not found; SQL statement: INSERT into userProfile(userId, email, firstName, lastName, name, username) values(?,?,?,?,?,?) [42102-185]

USERPROFILE 表也丢失了。

在我发布大量配置片段之前,您是否已经知道我可能忘记了告诉 spring 为我创建这些表的内容?:)

目前我正在使用 Spring Boot 标准 H2 内存数据库,它与 JpaRepositories 配合得很好。

谢谢你!:)

4

1 回答 1

3

自己找到了解决方案:)

我最终发现第一件事不是由一些花哨的自动 Spring 机制处理,而是在 src/main/resources 目录中有一个简单的“schema.sql”。

create table UserConnection (
  userId varchar(255) not null,
  providerId varchar(255) not null,
  providerUserId varchar(255),
  rank int not null,
  displayName varchar(255),
  profileUrl varchar(512),
  imageUrl varchar(512),
  accessToken varchar(1024) not null,
  secret varchar(255),
  refreshToken varchar(255),
  expireTime bigint,
  primary key (userId, providerId, providerUserId));
create unique index UserConnectionRank on UserConnection(userId, providerId, rank);

create table UserProfile (
  userId varchar(255) not null,
  email varchar(255),
  firstName varchar(255),
  lastName varchar(255),
  name  varchar(255),
  username varchar(255),
  primary key (userId));
create unique index UserProfilePK on UserProfile(userId);

于 2015-05-13T15:33:30.103 回答