我想使用以下代碼為 Spring Authorization Server 創建 JPA 存盤庫:
https://programmer.group/spring-oauth2-authorization-server-configuration-details.html
CREATE TABLE oauth2_registered_client
(
id varchar(100) NOT NULL,
client_id varchar(100) NOT NULL,
client_id_issued_at timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
client_secret varchar(200) NULL,
client_secret_expires_at timestamp NULL,
client_name varchar(200) NOT NULL,
client_authentication_methods varchar(1000) NOT NULL,
authorization_grant_types varchar(1000) NOT NULL,
redirect_uris varchar(1000) NULL,
scopes varchar(1000) NOT NULL,
client_settings varchar(2000) NOT NULL,
token_settings varchar(2000) NOT NULL,
PRIMARY KEY (id)
);
public class RegisteredClient implements Serializable {
private static final long serialVersionUID = Version.SERIAL_VERSION_UID;
private String id;
private String clientId;
private Instant clientIdIssuedAt;
private String clientSecret;
private Instant clientSecretExpiresAt;
private String clientName;
private Set<ClientAuthenticationMethod> clientAuthenticationMethods;
private Set<AuthorizationGrantType> authorizationGrantTypes;
private Set<String> redirectUris;
private Set<String> scopes;
private ClientSettings clientSettings;
private TokenSettings tokenSettings;
// ellipsis
}
我創建了這個物體:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Entity
@Table(name = "oauth2_registered_client")
public class RegisteredClient {
@Id
@Column(name = "id", length = 100, nullable = false)
private String id;
@Column(name = "client_id", length = 100, nullable = false)
private String clientId;
@Column(name = "client_id_issued_at", nullable = false)
private Instant clientIdIssuedAt;
@Column(name = "client_secret", length = 200)
private String clientSecret;
@Column(name = "client_secret_expires_at")
private Instant clientSecretExpiresAt;
@Column(name = "client_name", length = 200, nullable = false)
private String clientName;
@Column(name = "client_authentication_methods", length = 1000, nullable = false)
private Set<ClientAuthenticationMethod> clientAuthenticationMethods;
@Column(name = "authorization_grant_types", length = 1000, nullable = false)
private Set<AuthorizationGrantType> authorizationGrantTypes;
@Column(name = "redirect_uris", length = 1000)
private Set<String> redirectUris;
@Column(name = "scopes", length = 1000, nullable = false)
private Set<String> scopes;
@Column(name = "client_settings", length = 2000, nullable = false)
private ClientSettings clientSettings;
@Column(name = "token_settings", length = 2000, nullable = false)
private TokenSettings tokenSettings;
}
但是當我開始這個專案時,我得到:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: oauth2_registered_client, for columns: [org.hibernate.mapping.Column(authorization_grant_types)]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1290)
at org.auth.MerchantHubAuthApplication.main(MerchantHubAuthApplication.java:13)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: oauth2_registered_client, for columns: [org.hibernate.mapping.Column(authorization_grant_types)]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
... 16 common frames omitted
Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: oauth2_registered_client, for columns: [org.hibernate.mapping.Column(authorization_grant_types)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:515)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:482)
at org.hibernate.mapping.Property.isValid(Property.java:231)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:627)
at org.hibernate.mapping.RootClass.validate(RootClass.java:267)
at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:359)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:314)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
... 20 common frames omitted
你知道我該如何解決這個問題嗎?
uj5u.com熱心網友回復:
這似乎需要一個@OneToMany注釋
@OneToMany(targetEntity=AuthorizationGrantType.class, mappedBy="?")
@Column(name = "authorization_grant_types", length = 1000, nullable = false)
private Set<AuthorizationGrantType> authorizationGrantTypes;
uj5u.com熱心網友回復:
您正在打破使用 hibernate 的一些重要規則 - 即您應該只保留帶有注釋的 POJO 類(您創建的)@Entity。在這種情況下,您在 a 列中參考Set<AuthorizationGrantType>它是 Spring Security 定義的類。那是行不通的。
您應該保留您需要計算的資訊AuthorizationGrantType,例如一組字串或列舉值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/419233.html
標籤:
