Sto utilizzando JBoss 5.1 con Hibernate 3.6, JPA 2.0 e Spring 3.0.5. Io uso Maven per costruire il file EAR che assomiglia a:JBoss 5.1: Classi di entità non trovate (vfszip)
AutoTrader.ear
-------> META-INF
--------------> application.xml
--------------> jboss-app.xml
--------------> MANIFEST.MF
-------> AutoTrader.war
se schiero questo file ear in JBoss 5.1, ottengo l'errore
org.springframework.dao.InvalidDataAccessApiUsageException: Not an entity: class uk.co.aol.shipmanager.domain.Manager; nested exception is ja
va.lang.IllegalArgumentException: Not an entity: class uk.co.aol.shipmanager.domain.Subscription
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:286) ~[at_war-1.0.war:3
.0.5.RELEASE]
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:104) ~[at_war-1.0.war:3.0.5.RELEASE
]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:368) ~[at_war-1.
0.war:3.0.5.RELEASE]
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58
) ~[at_war-1.0.war:3.0.5.RELEASE]
Tuttavia, se distribuire il file WAR è esplosa , funziona bene. Qualsiasi suggerimento è benvenuto.
Grazie, Adi
UPDATE:
Ho aggiunto un ResourceScanner estendentesi NativeScanner:
public class ResourceScanner extends NativeScanner {
@Override
public Set<Class<?>> getClassesInJar(final URL jarToScan,
final Set<Class<? extends Annotation>> annotationsToLookFor) {
return super.getClassesInJar(patchUrl(jarToScan), annotationsToLookFor);
}
@Override
public Set<NamedInputStream> getFilesInJar(final URL jarToScan, final Set<String> filePatterns) {
return super.getFilesInJar(patchUrl(jarToScan), filePatterns);
}
@Override
public Set<Package> getPackagesInJar(final URL jarToScan,
final Set<Class<? extends Annotation>> annotationsToLookFor) {
return super.getPackagesInJar(patchUrl(jarToScan), annotationsToLookFor);
}
@Override
public String getUnqualifiedJarName(final URL jarToScan) {
return super.getUnqualifiedJarName(patchUrl(jarToScan));
}
/**
* Patch the VFS URL to a FILE protocol URL.
*
* @param url
* original URL.
* @return either the original, either the corresponding FILE protocol of given VFS URL.
*/
protected URL patchUrl(final URL url) {
String protocol = url.getProtocol();
if (protocol.equals("vfs")) {
try {
File file = new File(url.getFile());
return file.toURI().toURL();
} catch (final MalformedURLException e) {
return url;
} catch (IOException e) {
e.printStackTrace();
return url;
}
}
return url;
}
}
e, in primavera-persistence.xml,
<property name="hibernate.ejb.resource_scanner" value="uk.co.aol.shipmanager.ResourceScanner"/>
Th è di nuovo funziona nel file di guerra esploso.
Ma nel caso di un EAR file di , il protocollo è vfszip non VFS.
Si prega di dire cosa fare ???
Sembra che l'orecchio esploso funzioni perché è in grado di trovare i file jar dipendenti. Penso che con un EAR sia necessario fare riferimento a quelli nel classpath del file manifest, o magari nel file application.xml. Sembra un problema di classpath, o forse è un problema di ordine di distribuzione. Se la classe cerca l'entità che distribuisce per prima quando si trova in un EAR, ma forse la versione esplosa viene distribuita in un ordine diverso. Qualche volta è un problema, quindi controlla le tue dipendenze e verifica se è possibile definirle in un EAR. – Logan
Qual è il layout di WAR? Hai un persistence.xml? Hai annotato le classi Manager e Subscription con @Entity (o fornito la configurazione XML appropriata). I JAR di terze parti dovrebbero essere contenuti in una directory lib di WARs WEB-INF/lib o ed EARs. – kierans