【问题标题】:Log4j + OpenJPA = NoClassDefFoundError: javax/persistence/AttributeConverterLog4j + OpenJPA = NoClassDefFoundError: javax/persistence/AttributeConverter
【发布时间】:2013-10-09 22:57:04
【问题描述】:

我正在尝试获取 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、 消息、标记、Throwable、ThreadContext.ContextStack 和 Map) 将不会被 JPA 提供程序识别。在 与@Convert 结合使用,您可以使用 org.apache.logging.log4j.core.appender.db.jpa.converter 包到 将这些类型转换为数据库列。

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

java.lang.NoClassDefFoundError: javax/persistence/AttributeConverter

【问题讨论】:

  • 你在使用任何转换器吗?
  • 您使用的是哪个 JPA 版本?是 JPA 2.1 吗?
  • org.apache.openjpa v2.2.2。到目前为止,我只有持久性配置(如图所示)和一个实体类 ReportEntity 扩展 BasicLogEventEntity 没有显式转换

标签: java hibernate jpa logging log4j


【解决方案1】:

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

只是好奇,为什么你这么坚持使用 JPA 进行日志持久化?有很多基于 JDBC 的解决方案运行良好。除非您打算在应用程序中使用与日志记录相关的实体,否则我看不出有任何使用 JPA 解决方案的理由。

【讨论】:

  • org.apache.openjpa v2.2.2。因为我的整个项目都在 JPA 下,我很想拥有一个用于日志记录的版本持久性单元。
  • 来自 Apache OpenJPA 的主页,OpenJPA 2.2.2 是“JSR-317 Java Persistence 2.0 规范的兼容实现”。所以我相信它不符合 JPA 2.1。而且,虽然你的项目在 JPA 下,但如果你不打算在项目中使用日志相关的实体,那么使用 JPA 持久化日志仍然没有意义(实际上我会说这是一个糟糕的选择,因为所有额外的开销)
猜你喜欢
  • 1970-01-01
  • 2013-03-08
  • 2011-02-20
  • 2018-05-07
  • 1970-01-01
  • 2017-04-02
  • 2020-05-28
  • 1970-01-01
  • 2016-05-14
相关资源
最近更新 更多