2012-07-25 8 views
5

Tenemos una aplicación empresarial que utiliza la biblioteca Joda DateTime. La aplicación se implementa en un contenedor JBoss 7.2.0 Alpha1. Algunas clases en nuestro modelo de dominio tienen anotaciones @Past en campos de tipo DateTime. Para validar estas restricciones, nos gustaría usar los validadores de restricciones provistos por hibernate-validator. Por lo tanto, agregamos una dependencia 'org.hibernate.validator' al MANIFEST.MF de nuestro archivo ear. Estamos usando la versión 2.0 de la biblioteca Joda. Por lo tanto, hemos empaquetado el archivo joda-time-2.0.jar en nuestro oído. No estamos utilizando la versión 1.6.2 que está disponible como un módulo de JBoss 7Usando el validador de hibernación JodaTime restricciones de validación en JBoss

Al validar un objeto con un campo DateTime se lanza siguiente excepción:

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] 

Después de una cierta depuración detectamos que la llamada a 'TypeUtils.isAssignable (validatorType, type)' en 'ConstraintTree.findSuitableValidatorTypes' falla ya que los tipos de validador disponibles se toman de la biblioteca Joda que se ha enviado con JBoss en lugar de la biblioteca Joda que se empaqueta en nuestro archivo ear.

Supongo que estamos haciendo algo mal con respecto a la carga de clases. ¿Alguien puede darme una pista?

+0

El uso de la biblioteca joda-time-1.6.2 que viene con JBoss I tampoco puede hacer que funcione. ¿Puedes hacer que funcione con 1.6.2? – siebz0r

+0

Por lo que yo entendí el código, el problema es un problema de carga de clases. Los tipos disponibles almacenados en caché por hibernate-validator han sido cargados por el cargador de módulos del módulo jboss 'org.hibernate.time', mientras que el DateTime dado como entrada para la validación proviene de mi oído. Es decir. ha sido cargado por el cargador de clases del archivo ear. Por lo tanto, la llamada a 'Class.isAssignableFrom' siempre fallará. No importa si es Joda 2.0 o 1.6.2. Dado que usamos la característica de 2.0 no podemos usar el módulo Joda enviado con JBoss. – woelfle

Respuesta

3

¿Ha intentado agregar jboss-deployment-structure.xml a su archivo ear? De esta manera usted debería ser capaz de excluir el módulo de tiempo de Joda:

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

Véase también https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

2

Siguiendo la idea de Hardy I resuelto mi problema creando un jboss- despliegue a structure.xml en WEB de mi solicitud -INF carpeta que contiene lo siguiente:

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

En lugar de excluir org.joda.time excluí org.hibernate.validator. Espero que esto funcione para ti también.

Cuestiones relacionadas