Hello Jeremy, thank you for your investigations. I might have come up with a reason for this problem. I tried to simply load the class TypeMapping during the maven integration test exactly before the openJPA test begun. It did not load, but an ExceptionInInitializer was thrown. Though openJPA was in its final decision right as the class was 'bad' cause it was not loadable.
However, the really interesting thing is why in the maven test phase the static initializer failed and thus the class did not load. Within the static initializer we load an xml-file via Thread.currentThread().getContextClassLoader().getResourceAsStream( "/TypeMapping.xml") As this seems to work well inside the application server, it does not work when maven's integration phase is running. The xml file is not found. Without the leading slash it works for both, the application server AND maven's integration phase. To summarize: 1) openJPA does not cause this the problem 2) the actual cause WHY the class is bad for meta data is hidden and leads to difficult-to-find problems. If the stack trace contained the ExceptionInInitializer-Exception, this mail would have never been written ;-) 3) Maybe providing the causing exception in future versions of openJPA (although I'm stuck at openJPA 1.0.4 right now) would be an improvement. Best regards, and thank you again for your short reply. Heiko [email protected] schrieb am 28.09.2010 16:14:10: > Hi Heiko, > > Odd problem, indeed. I'll setup a similar environment and let you know if I > have any suggestions. Which version of maven are you using and which OS? > > -Jeremy > > On Tue, Sep 28, 2010 at 5:10 AM, Heiko Kopp <[email protected]>wrote: > > > > > Hello, > > > > I've encountered a problem when using openJPA inside mavens integration > > test > > phase. Alot of my entities respectively their members have been annotated > > with @Factory and @Externalizer to automatically convert database datatypes > > into schema relevent enumerations. An example for this is: > > > > @Entity > > @Table(name = "PARTNER", schema = "PART") > > public class Partner > > { > > .... > > > > @Column(name = "I_SCHL_WERTBEZ") > > @Externalizer(TypeMapping.MARSHAL_SALUTATION_INDIVIDUAL) > > @Factory(TypeMapping.UNMARSHAL_SALUTATION_INDIVIDUAL) > > private SalutationIndividualEnum salutationIndividual; > > > > ... > > } > > > > The Externalizer- and Factory-Methods have been extracted into a separate > > class called 'TypeMapping'. In this class we additionally have the > > following > > string constants as used above: > > > > public static final String MARSHAL_SALUTATION_INDIVIDUAL > > = > > > > "com.mbbank.partner.pas.common.system.typemapping.TypeMapping. > marshalSalutationIndividual"; > > > > public static final String UNMARSHAL_SALUTATION_INDIVIDUAL > > = > > > > "com.mbbank.partner.pas.common.system.typemapping.TypeMapping. > unmarshalSalutationIndividual"; > > > > These strings referr to the actuall methods. > > > > The TypeMapping-class is located in a different package than the entity > > class. And this seems to be a problem during test test phase in maven. > > While > > the code works perfectly in the application server, it fails in the maven > > test phase with the following exception: > > > > <openjpa-1.0.4-SNAPSHOT-r420667:809016 fatal user error> > > org.apache.openjpa.persistence.ArgumentException: Der Klassenname > > "com.mbbank.partner.pas.common.system.typemapping.TypeMapping", der in der > > Metadatenerweiterung im Feld > > > > "com.mbbank.partner.pas.common.system.database.model.Person. > salutationIndividual" > > verwendet wird, ist nicht gültig. > > at org.apache.openjpa.meta.JavaTypes.classForName(JavaTypes.java:227) > > at > > org.apache.openjpa.meta.JavaTypes.classForName(JavaTypes.java:194) > > at > > org.apache.openjpa.meta.JavaTypes.classForName(JavaTypes.java:185) > > at > > org.apache.openjpa.meta.FieldMetaData.findMethod(FieldMetaData.java:1533) > > at > > > > org.apache.openjpa.meta.FieldMetaData. > getExternalizerMethod(FieldMetaData.java:1465) > > at > > org.apache.openjpa.meta.FieldMetaData.resolve(FieldMetaData.java:1640) > > at > > org.apache.openjpa.jdbc.meta.FieldMapping.resolve(FieldMapping.java:400) > > at > > org.apache.openjpa.meta.ClassMetaData.resolveMeta(ClassMetaData.java:1688) > > at > > org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1623) > > at > > > > org.apache.openjpa.meta.MetaDataRepository. > processBuffer(MetaDataRepository.java:675) > > at > > > > org.apache.openjpa.meta.MetaDataRepository. > resolveMeta(MetaDataRepository.java:574) > > at > > > > org.apache.openjpa.meta.MetaDataRepository. > resolve(MetaDataRepository.java:499) > > at > > > > org.apache.openjpa.meta.MetaDataRepository. > getMetaData(MetaDataRepository.java:301) > > at > > org.apache.openjpa.kernel.BrokerImpl.newObjectId(BrokerImpl.java:1060) > > at > > > > org.apache.openjpa.kernel.DelegatingBroker. > newObjectId(DelegatingBroker.java:252) > > at > > > > org.apache.openjpa.persistence.EntityManagerImpl. > find(EntityManagerImpl.java:347) > > > > The string is localized into German, the original one is referred to as > > 'bad-class'. It's English representation is: > > > > bad-class: The class name "{0}" used in a metadata extension on field "{1}" > > is not valid. > > > > As both class files are present in the same module and even during the test > > phase, I've actually no clue on how to fix this issue. It can be fixed, > > when > > I put the static methods in the same package/class as the annotated field, > > but that is no solutation for us as it will duplicate a lot of code. > > > > Has anyone an idea why this appends and what can be done to prevent it? > > > > Thank you very much. > > > > As seen in the stack trace above, I'm using openJPA 1.0.4-<something>, > > which > > is part of the Websphere Application Server 6.1.0.29. > > > > Best regards, > > > > Heiko > > -- > > View this message in context: > > http://openjpa.208410.n2.nabble.com/Externalizer-not-working- > during-maven-test-phase-tp5578748p5578748.html > > Sent from the OpenJPA Users mailing list archive at Nabble.com. > > If you are not the intended addressee, please inform us immediately that you have received this e-mail in error, and delete it. We thank you for your cooperation.
