计划是在我的安全库中拥有一个用户,这将在生产程序中扩展我的生产用户。安全库包含jwt令牌和其他安全问题,例如验证和注册表。我假设Spring尚未映射安全库中的实体,但我如何配置主组件。
运行程序时,出现以下错误:
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 org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.lingner.security.entity.Authority.users[com.lingner.security.entity.User]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) ~[spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:742) ~[spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:389) ~[spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) ~[spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1213) ~[spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1202) ~[spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
at com.proqrent.expension.ExpensionApplication.main(ExpensionApplication.java:16) ~[classes/:na]
Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.lingner.security.entity.Authority.users[com.lingner.security.entity.User]
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1274) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:811) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:736) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1696) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1664) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:287) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935) ~[hibernate-core-5.3.10.Final.jar:5.3.10.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) ~[spring-orm-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) ~[spring-orm-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) ~[spring-orm-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
... 16 common frames omitted
Process finished with exit code 1
我已经尝试过使用批注,但是我从来没有遇到过这个错误。
我的主程序代码:
package com.proqrent.expension;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication
@ComponentScan(basePackages = {"com.proqrent.expension.*", "com.lingner.security.*"})
@EntityScan(basePackages = {"com.proqrent.expension.data.model", "com.lingner.security.entity"})
@EnableJpaRepositories(basePackages = {"com.proqrent.expension.data.repositories", "com.lingner.security.repository"})
public class ExpensionApplication {
public static void main(String[] args) {
SpringApplication.run(ExpensionApplication.class, args);
}
}
程序代码中的POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.proqrent</groupId>
<artifactId>expension</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Expension</name>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>com.lingner</groupId>
<artifactId>security</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我来自库的POM:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lingner</groupId>
<artifactId>security</artifactId>
<version>1.0</version>
<name>security</name>
<description>Security library with Json web token</description>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>findbugs</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-xjc</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.5.RELEASE</version>
<configuration>
<executable>true</executable>
<finalName>security</finalName>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
我在库中的实体: 1
package com.lingner.security.entity;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
/**
* The authority is important for the data security.
* Because not every user should be able to use every part of the application.
* So we have different types of authority.
*
* @see AuthorityName
*/
@Entity
@Table(name = "AUTHORITY")
public class Authority {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "NAME", length = 50)
@NotNull
@Enumerated(EnumType.STRING)
private AuthorityName name;
//@Embedded
@ManyToMany(mappedBy = "authorities", fetch = FetchType.LAZY)
private List<User> users = new ArrayList<>();
private String username;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public AuthorityName getName() {
return name;
}
public void setName(AuthorityName name) {
this.name = name;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
2
package com.lingner.security.entity;
import com.lingner.security.validators.UniqueUsername;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* The User class stores every single information about an user
*/
@MappedSuperclass
@Embeddable
public class User implements Serializable {
/**
* Id attribute.
*/
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* Username attribute.
*/
@Column(name = "USERNAME", length = 50, unique = true)
@NotNull
@UniqueUsername(message="Username already exists")
@Size(min = 4, max = 50, message = "Username have to be grater than 4 characters")
private String username;
/**
* Password attribute.
*/
@Column(name = "PASSWORD", length = 100)
@NotNull
@Size(min = 4, max = 255, message = "Password have to be grater than 4 characters")
private String password;
/**
* Firstname attribute.
*/
@Column(name = "FIRSTNAME", length = 50)
@Size(min = 4, max = 50)
private String firstname;
/**
* Lastname attribute.
*/
@Column(name = "LASTNAME", length = 50)
@Size(min = 4, max = 50)
private String lastname;
/**
* Email attribute.
*/
@Column(name = "EMAIL", length = 50)
@NotNull
@Size(min = 4, max = 50)
private String email;
/**
* Enabled attribute.
*/
@Column(name = "ENABLED")
@NotNull
private Boolean enabled;
/**
* LastPasswordResetDate attribute.
*/
@Column(name = "LASTPASSWORDRESETDATE", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
@Temporal(TemporalType.TIMESTAMP)
@NotNull
private Date lastPasswordResetDate;
/**
* Authorities attribute.
*/
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "USER_AUTHORITY",
joinColumns = {@JoinColumn(name = "USER_ID", referencedColumnName = "ID", unique = true)},
inverseJoinColumns = {@JoinColumn(name = "AUTHORITY_ID", referencedColumnName = "ID")})
private List<Authority> authorities = new ArrayList<>();
public User(@NotNull @Size(min = 4, max = 50, message = "Username have to be grater than 4 characters") String username,
@NotNull @Size(min = 4, max = 255, message = "Password have to be grater than 4 characters") String password,
@Size(min = 4, max = 50) String firstname, @Size(min = 4, max = 50) String lastname, @NotNull @Size(min = 4, max = 50) String email,
@NotNull Boolean enabled, @NotNull Date lastPasswordResetDate, List<Authority> authorities) {
this.username = username;
this.password = password;
this.firstname = firstname;
this.lastname = lastname;
this.email = email;
this.enabled = enabled;
this.lastPasswordResetDate = lastPasswordResetDate;
this.authorities = authorities;
}
public User() {
}
/**
* Returns the id of the user.
* @return Long value of ud.
*/
public Long getId() {
return id;
}
/**
* Sets the id of the user.
* @param id Long value.
*/
public void setId(Long id) {
this.id = id;
}
/**
* Returns the username of the user.
* @return String value of username.
*/
public String getUsername() {
return username;
}
/**
* Sets the username of the user.
* @param username String value.
*/
public void setUsername(String username) {
this.username = username;
}
/**
* Returns the password of the user.
* @return String value of password.
*/
public String getPassword() {
return password;
}
/**
* Sets the password of the user.
* @param password String value.
*/
public void setPassword(String password) {
this.password = password;
}
/**
* Returns the firstname of the user.
* @return String value of firstname.
*/
public String getFirstname() {
return firstname;
}
/**
* Sets the firstname of the user.
* @param firstname String value.
*/
public void setFirstname(String firstname) {
this.firstname = firstname;
}
/**
* Returns the lastname of the user.
* @return String value of lastname.
*/
public String getLastname() {
return lastname;
}
/**
* Sets the lastname of the user.
* @param lastname String value.
*/
public void setLastname(String lastname) {
this.lastname = lastname;
}
/**
* Returns the email of the user.
* @return Sting value of email.
*/
public String getEmail() {
return email;
}
/**
* Sets the email of the user.
* @param email Sting value.
*/
public void setEmail(String email) {
this.email = email;
}
/**
* Returns if user is enabled.
* @return Boolean value of enabled.
*/
public Boolean getEnabled() {
return enabled;
}
/**
* Sets the enabled value of the user.
* @param enabled Boolean value.
*/
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
/**
* Returns the authorities of the user.
* @return List of authority.
*/
public List<Authority> getAuthorities() {
return authorities;
}
/**
* Sets the authorities of the user.
* @param authorities List of Authority.
*/
public void setAuthorities(List<Authority> authorities) {
this.authorities = authorities;
}
/**
* Returns the lastPasswordResetDate of the user.
* @return Date of lastPasswordResetDate.
*/
public Date getLastPasswordResetDate() {
return lastPasswordResetDate;
}
/**
* Sets the lastPasswordResetDate of the user.
* @param lastPasswordResetDate Date object.
*/
public void setLastPasswordResetDate(Date lastPasswordResetDate) {
this.lastPasswordResetDate = lastPasswordResetDate;
}
}
也许你给我一些提示,这样我就可以克服我的错误。