Log4j + OpenJPA = NoClassDefFoundError:javax / persistence / AttributeConverter

时间:2013-10-09 22:57:05

标签: java hibernate jpa logging log4j

我正在尝试获取log4j(我也很乐意使用任何日志记录api作为日志,因为它是jpa持久性)使用jpa appender。

我的persistence.xml看起来像这样

<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <class>org.apache.camel.processor.interceptor.jpa.JpaTraceEventMessage</class>
    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapAttributeConverter</class>
    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.ContextMapJsonAttributeConverter</class>
    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackAttributeConverter</class>
    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.ContextStackJsonAttributeConverter</class>
    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.MarkerAttributeConverter</class>
    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.MessageAttributeConverter</class>
    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.StackTraceElementAttributeConverter</class>
    <class>org.apache.logging.log4j.core.appender.db.jpa.converter.ThrowableAttributeConverter</class>
    <class>com.xxxxxx.lab.logging.ReportEntity</class>
    <properties>
        <property name="openjpa.jdbc.DBDictionary" value="org.apache.openjpa.jdbc.sql.HSQLDictionary"/>
        <!-- value="buildSchema" to runtime forward map the DDL SQL; value="validate" makes no changes to the database -->
        <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>
        <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
    </properties>
</persistence-unit>

根据apidocs:

  

许多LogEvent方法的返回类型(例如,StackTraceElement,   Message,Marker,Throwable,ThreadContext.ContextStack,和   地图)将不被JPA提供者识别。在   与@Convert结合,你可以使用转换器   org.apache.logging.log4j.core.appender.db.jpa.converter包到   将这些类型转换为数据库列。

所以我添加了所有必要的类,但它仍然会抛出:

java.lang.NoClassDefFoundError: javax/persistence/AttributeConverter

1 个答案:

答案 0 :(得分:3)

AttributeConverter似乎是JPA2.1中的新功能。您确定您的项目使用的是JPA2.1而不是任何以前的版本吗?

好奇,为什么你坚持使用JPA来保持日志持久性?有很多基于JDBC的解决方案,效果很好。我没有看到使用JPA解决方案的任何理由,除非您打算在应用程序中使用与日志记录相关的实体。