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
来设置JPA
EntityManagerFactory
。 在扫描的实体中,我使用
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所需的
授权
。 但是我仍然不明白为什么这个接口实现会给JPA
EntityManagerFactory
使用的
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");  
    }
}