2012-07-25 18 views
5

Abbiamo un'applicazione enterprise che utilizza la libreria DateTime di Joda. L'applicazione è distribuita in un contenitore Alpha1 JBoss 7.2.0. Alcune classi nel nostro modello di dominio hanno annotazioni @Past su campi di tipo DateTime. Per convalidare questi vincoli vorremmo usare i validatori di vincoli forniti da Hibernate-validator. Pertanto abbiamo aggiunto una dipendenza "org.hibernate.validator" al MANIFEST.MF del nostro file ear. Stiamo usando la versione 2.0 della libreria Joda. Pertanto abbiamo inserito nel nostro orecchio il file joda-time-2.0.jar. Non stiamo usando la versione 1.6.2 che è disponibile come modulo di JBoss 7Utilizzo dei vincoli di convalida del bean JodaTime in JBoss

Quando convalidare un oggetto con un campo DateTime viene generata seguente eccezione:

10:51:41,140 ERROR [org.acme.GlobalExceptionHandler] (EJB default - 10) Exception caught by global exception handler: javax.validation.UnexpectedTypeException: No validator could be found for type: org.joda.time.DateTime 
at org.hibernate.validator.engine.ConstraintTree.verifyResolveWasUnique(ConstraintTree.java:383) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final] 
at org.hibernate.validator.engine.ConstraintTree.findMatchingValidatorClass(ConstraintTree.java:364) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final] 
at org.hibernate.validator.engine.ConstraintTree.getInitializedValidator(ConstraintTree.java:313) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final] 
at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:144) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final] 
at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:117) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final] 
at org.hibernate.validator.metadata.MetaConstraint.validateConstraint(MetaConstraint.java:84) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final] 
at org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:452) [hibernate-validator-4.2.0.Final.jar:4.2.0.Final] 

Dopo debugging abbiamo rilevato che la chiamata a 'TypeUtils.isAssignable (validatorType, type)' in 'ConstraintTree.findSuitableValidatorTypes' fallisce poiché i tipi di validatori disponibili sono presi dalla libreria Joda che è stata fornita con JBoss invece della libreria Joda che è inclusa nel nostro file ear.

Immagino che stiamo facendo qualcosa di sbagliato per quanto riguarda il caricamento delle classi. Qualcuno può darmi un suggerimento?

+0

Utilizzando la libreria joda-time-1.6.2 fornita con JBoss, non riesco a farla funzionare. Puoi farlo funzionare con 1.6.2? – siebz0r

+0

Per quanto ho capito il codice il problema è un problema di classloading. I tipi disponibili nella cache di hibernate-validator sono stati caricati dal modulo loader del modulo jboss 'org.hibernate.time' mentre il DateTime dato come input per la convalida è dal mio orecchio. Cioè è stato caricato dal classloader del file ear. Pertanto la chiamata a "Class.isAssignableFrom" fallirà sempre. Non importa se è Joda 2.0 o 1.6.2. Poiché utilizziamo la funzionalità di 2.0, non possiamo utilizzare il modulo Joda fornito con JBoss. – woelfle

risposta

3

Hai provato ad aggiungere un file jboss-deployment-structure.xml nel tuo file ear? In questo modo si dovrebbe essere in grado di escludere il modulo di tempo Joda:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure> 
    <deployment> 
     <exclusions> 
      <module name="org.joda.time"/> 
     </exclusions> 
    </deployment> 
</jboss-deployment-structure> 

Vedi anche https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

2

seguente idea di Hardy Ho risolto il mio problema creando un jboss-distribuzione-structure.xml in WEB di mia applicazione -INF cartella contenente questo:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure> 
    <deployment> 
     <exclusions> 
      <module name="org.hibernate.validator" /> 
     </exclusions> 
    </deployment> 
</jboss-deployment-structure> 

Invece di escludere org.joda.time ho escluso org.hibernate.validator. Spero che questo funzioni anche per te.

Problemi correlati