2013-10-09 2 views
1

Я пытаюсь получить log4j (я также был бы рад использовать любое logging api как журнал, так как это jpa persistent) использовать jpa appender.Log4j + OpenJPA = NoClassDefFoundError: javax/persistence/AttributeConverter

Мой 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:

Many of the return types of LogEvent methods (e.g., StackTraceElement, Message, Marker, Throwable, ThreadContext.ContextStack, and Map) will not be recognized by the JPA provider. In conjunction with @Convert, you can use the converters in the org.apache.logging.log4j.core.appender.db.jpa.converter package to convert these types to database columns.

Поэтому я добавил все необходимые классы, но он по-прежнему бросает:

java.lang.NoClassDefFoundError: javax/persistence/AttributeConverter 
+0

Вы используете какие-либо конвертеры? –

+0

Какая версия JPA вы используете? Это JPA 2.1? –

+0

org.apache.openjpa v2.2.2. До сих пор у меня была простая конфигурация (как показано) и один класс Entity class ReportEntity, расширяющий BasicLogEventEntity без конверсии без объяснения причин. – Macchiatow

ответ

3

AttributeConverter кажется что-то новое в JPA2.1. Вы уверены, что ваш проект использует JPA2.1 вместо любой предыдущей версии?

Любопытно, почему вы так настаиваете на использовании JPA для сохранения журнала? Существует множество решений на базе JDBC, которые хорошо работают. Я не вижу причины использовать решение JPA, если вы не собираетесь использовать связанные с протоколированием сущности в своем приложении.

+0

org.apache.openjpa v2.2.2. Потому что весь мой проект находится под JPA, я бы хотел, блок для ведения журналов. – Macchiatow

+0

С сайта Apache OpenJPA OpenJPA 2.2.2 является «совместимой реализацией спецификации JSR-317 Java Persistence 2.0». Поэтому я не согласен с JPA 2.1. И хотя ваш проект находится под JPA, если вы не собираетесь использовать связанные с протоколированием проекты в своем проекте, все же бессмысленно использовать постоянство JPA для журнала (на самом деле это плохой выбор, я скажу, из-за всех дополнительных накладных расходов) –