Java 无法为实现Spring Security UserDetails的类加载请求的类异常
我使用Java 无法为实现Spring Security UserDetails的类加载请求的类异常,java,spring,jpa,spring-security,Java,Spring,Jpa,Spring Security,我使用LocalContainerEntityManagerFactoryBean来设置JPAEntityManagerFactory。 在扫描的实体中,我使用setPackagesToScan进行扫描,我有一个实现spring安全界面UserDetails的用户实体 当我在应用程序中使用午餐时,出现以下错误: Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load
LocalContainerEntityManagerFactoryBean
来设置JPAEntityManagerFactory
。
在扫描的实体中,我使用setPackagesToScan
进行扫描,我有一个实现spring安全界面UserDetails
的用户实体
当我在应用程序中使用午餐时,出现以下错误:
Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [com.medkhelifi.model.entities.User]
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:354)
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.<init>(AnnotationMetadataSourceProcessorImpl.java:105)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.<init>(MetadataBuildingProcess.java:156)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:150)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1821)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1758)
... 11 more
Caused by: java.lang.ClassNotFoundException: Could not load requested class : com.medkhelifi.model.entities.User
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader.findClass(ClassLoaderServiceImpl.java:342)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:351)
... 23 more
用户实体
@Data
@Entity
@Table(name = "user")
public class User implements UserDetails {
private static final Logger logger = LoggerFactory.getLogger(User.class);
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
@NotEmpty
private String firstname;
@NotEmpty
private String lastname;
@NotEmpty
private String email;
@NotEmpty
private String password;
//@ElementCollection(fetch = FetchType.EAGER)
//@Builder.Default
@DBRef
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "user_role",
joinColumns = @JoinColumn(name = "id_user"),
inverseJoinColumns = @JoinColumn(name = "id_role"))
private List<Role> roles = new ArrayList<>();
// Override methods goes here
}
我希望我已经提供了足够的信息来提供帮助。我绕过了这个问题,从我的
用户
实体中删除了UserDetails
接口的实现,并建立了一个新机制来恢复Spring Security所需的授权
。
但是我仍然不明白为什么这个接口实现会给JPAEntityManagerFactory
使用的setPackagesToScan
带来问题
如果有人能给我们一个解释?你确定用户类在com.medkhelifi.model.entities包中吗?@SimonMartinelli是的。你是如何运行应用程序的?是Spring Boot吗?不,目前只是一个主应用程序(仅用于测试目的),我将更新帖子以添加主应用程序。如何“扫描”实体?需要注意的是,包名称可能不正确:原因:java.lang.ClassNotFoundException:无法加载请求的类:com.medkhelifi.model.entities.User vs the ComponentScan("Medkhrlfi…UserDetails的“get”实现方法是否被注释为transient?这很奇怪,我的猜测是因为UserDetails与您的实体不在同一个包中,hibernate无法加载ITE即使我将所有UserDetails方法标记为@transient,我仍然会得到相同的错误。也许您对hibernate及其容量的看法是正确的加载其他包类。我不确定。
@Data
@Entity
@Table(name = "user")
public class User implements UserDetails {
private static final Logger logger = LoggerFactory.getLogger(User.class);
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
@NotEmpty
private String firstname;
@NotEmpty
private String lastname;
@NotEmpty
private String email;
@NotEmpty
private String password;
//@ElementCollection(fetch = FetchType.EAGER)
//@Builder.Default
@DBRef
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "user_role",
joinColumns = @JoinColumn(name = "id_user"),
inverseJoinColumns = @JoinColumn(name = "id_role"))
private List<Role> roles = new ArrayList<>();
// Override methods goes here
}
public class DaoApp {
private static AnnotationConfigApplicationContext applicationContext= new AnnotationConfigApplicationContext (AppConfig.class);
public static void main(String[] args) throws ParseException {
System.out.println("main app for test purpose only started successfully");
}
}