在JPA实体中实例化JavaFX属性会导致"无法加载类"错误

时间:2017-06-06 02:11:09

标签: java hibernate jpa javafx

我在战争中有以下课程。它也是唯一具有任何JPA注释的类:

@MappedSuperclass
public abstract class BaseEntity {
    protected ObjectProperty<Object> loc3 = new SimpleObjectProperty<>();
}

当我部署战争时,我收到以下错误:

ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 65) MSC000001: Failed to start service jboss.persistenceunit."DevCrowd.war#prod": org.jboss.msc.service.StartException in service jboss.persistenceunit."DevCrowd.war#prod": org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [pl.devcrowd.virtual.business.state.entity.BaseEntity]
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:179)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:121)
    at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:667)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:193)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [pl.devcrowd.virtual.business.state.entity.BaseEntity]
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:232)
    at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.<init>(AnnotationMetadataSourceProcessorImpl.java:103)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.<init>(MetadataBuildingProcess.java:147)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:141)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874)
    at org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:161)
    ... 7 more
Caused by: java.lang.NoClassDefFoundError: javafx/beans/property/ObjectProperty
    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:226)
    ... 14 more
Caused by: java.lang.ClassNotFoundException: javafx.beans.property.ObjectProperty from [Module "deployment.DevCrowd.war:main" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93)
    ... 17 more

但如果我删除了实例化

@MappedSuperclass
public abstract class BaseEntity {
    protected ObjectProperty<Object> loc3;
}

有效。这也适用于IntegerProperty。

没有javafx bean的比较:

@MappedSuperclass
public abstract class BaseEntity {
    Object loc3 = new Object();
}

有或没有初始化。那是为什么?

编辑 - 运行时配置:

enter image description here

类路径条目:

enter image description here

1 个答案:

答案 0 :(得分:1)

根据我阅读Class Loading in WildFly的评论并根据访问JDK类下的内容,我将此jboss-deployment-structure.xml添加到我的src\main\webapp\WEB-INF文件夹中:

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <deployment>
        <dependencies>
            <system export="true">
                <paths>
                    <path name="javafx/beans/property"/>
                    <path name="javafx/beans/binding"/>
                </paths>
            </system>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

即使属性位于javafx.beans.property下,也可能需要这两个属性,因为他们的超类位于.binding