2010-10-27 3 views
1

J'ai rencontré quelques problèmes en utilisant Hibernate 3.4 sur JBoss 5.1. Hibernate 3.4 est une implémentation de JPA 1.0 et devrait donc pouvoir être utilisée dans JBoss 5.1. La chose est JBoss a sa propre version de Hibernate, qui se trouve à/common/lib alors que je ne veux pas utiliser la version fournie par JBoss. Ce que j'ai fait, c'est que j'ai supprimé le fichier hibernate-annotations.jar, le fichier hibernate-commons-annotations.jar, le fichier hibernate-core.jar, le fichier hibernate-entitymanager.jar, le fichier hibernate-jmx.jar et le fichier hibernate-validator.jar de ce répertoire. mon Hibernate 3.4 jars dans le répertoire server/default/lib. J'ai également compilé hibernate-validator.jar 3.1.0 dans mon fichier war car il semble que sinon JBoss ne puisse pas reconnaître l'emplacement du validateur. Après avoir fait tout ce qui précède, j'ai empaqueté mon fichier de guerre et l'ai déployé dans le dossier de déploiement.Essayez d'utiliser hibernate 3.4 dans JBoss 5.1 mais récupère javax.validation.ValidationException: Impossible de trouver un fournisseur par défaut

Le serveur a démarré sans problème. Mais quand j'ai essayé d'accéder à mon application web, il renvoie une erreur:

2010-10-27 10:55:13,416 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost]] (http-172.16.10.211-80-1) Exception Processing ErrorPage[exceptionType=java.lang.Exception, location=/app/uncaughtException] javax.servlet.ServletException: Servlet.init() for servlet roodummy threw exception at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1089) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:777) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:607) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:446) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:382) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:310) at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:416) at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:270) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:662) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0': Invocation of init method failed; nested exception is javax.validation.ValidationException: Unable to find a default provider at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1412) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:872) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458) at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339) at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306) at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127) at javax.servlet.GenericServlet.init(GenericServlet.java:212) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048) ... 16 more Caused by: javax.validation.ValidationException: Unable to find a default provider at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:264) at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:161) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1469) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409) ... 32 more

On dirait qu'il ne peut toujours pas trouver le validateur. Mais c'est déjà dans le fichier de guerre. J'ai testé mon application web dans un serveur jetée et cela a bien fonctionné. Qu'ai-je fait de mal dans la configuration de JBoss?

Répondre

1

The thing is JBoss has its own version of Hibernate, which is located at /common/lib whereas I don't want to use the version provided by JBoss.

Je pense que l'approche recommandée serait de regrouper les libs que vous souhaitez utiliser dans votre application et pour configurer JBoss pour charger des pots d'abord de votre application, en utilisant un jboss-web.xml avec le contenu suivant (voir ClassLoadingConfiguration):

<jboss-web> 
    <class-loading java2ClassLoadingCompliance="false"> 
    <loader-repository> 
     unique.packege.name:archive=your_project.war 
     <loader-repository-config> 
      java2ParentDelegation=false 
     </loader-repository-config> 
    </loader-repository> 
    </class-loading> 
</jboss-web> 

Je n'ai pas testé moi-même lors de l'utilisation Bean validation mais un utilisateur rapporté dans this thread (et aussi this one) qu'il avait encore à remplacer le validateur fourni à partir common/lib. Cela semble étrange et je ne peux pas confirmer que c'est nécessaire. Essayez sans d'abord.

+0

Il n'y a qu'un seul validateur qui est dans le fichier de guerre. J'ai déjà enlevé le validateur du common/lib. Je pense que le classloader devrait essayer de l'obtenir du fichier de guerre s'il ne pouvait pas le trouver ailleurs. – newguy

+0

@newguy: Je ne pense pas que les classes de common/lib puissent charger quelque chose à partir de votre webapp. Cependant, l'inverse fonctionnerait. –

0

Dans le cas où quelqu'un est toujours à la recherche d'une réponse. J'ai eu ce problème quand j'utilisais hibernate-validator 3.0.1 je l'ai changé en 4.2.0.Final et ça marche très bien.

aussi, assurez-vous que vous avez pot-validateur api installé

Questions connexes