UDA-EJIE / udaRUP

RUP components repository
Other
13 stars 10 forks source link

[UDA][Validaciones] Error al validar restricciones a nivel de clase #118

Closed ma-santamaria closed 6 years ago

ma-santamaria commented 6 years ago

En la versión 3.2.0 de UDA, si se intenta validar un bean que tenga restricciones a nivel de clase se produce el siguiente error:

Invalid property 'null' of bean class [\]: Bean property 'null' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

El origen del error reside en que la propiedad name de javax.validation.Path.Node es null para el objeto raíz; pero el método com.ejie.x38.validation.ValidationManager.validate convierte directamente dicho valor a String (de manera implícita por la concatenación que realiza).

Posteriormente esto provoca que el mismo método com.ejie.x38.validation.ValidationManager.validate trate de asociar el error de validación a la propiedad "null", que no existe en el bean validado, mediante la invocación a rejectValue.

hmartinez85 commented 6 years ago

Buenos días,

Necesitaría ver, como estas realizando la llamada para poder hacer la simulación.

Un saludo.

ma-santamaria commented 6 years ago

Buenos días,

añado un ejemplo que permite observar el comportamiento descrito:

BeanValidado.java:

@CheckEsElDoble
public class BeanValidado {

   private int unNumero;
   private int otroNumero;

   public BeanValidado() {
   }

   public int getUnNumero() {
      return unNumero;
   }

   public void setUnNumero(int unNumero) {
      this.unNumero = unNumero;
   }

   public int getOtroNumero() {
      return otroNumero;
   }

   public void setOtroNumero(int otroNumero) {
      this.otroNumero = otroNumero;
   }

}

CheckEsElDoble.java:

@Target({ TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = { EsElDobleValidator.class })
@Documented
public @interface CheckEsElDoble {

   String message() default "otro no es el doble de uno";

   Class<?>[] groups() default {};

   Class<? extends Payload>[] payload() default {};

}

EsElDobleValidator.java

public class EsElDobleValidator implements ConstraintValidator<CheckEsElDoble, BeanValidado> {

   @Override
   public void initialize(CheckEsElDoble constraintAnnotation) {
   }

   @Override
   public boolean isValid(BeanValidado value, ConstraintValidatorContext constraintContext) {
      if (value == null) {
         return true;
      }

      return value.getOtroNumero() == value.getUnNumero() * 2;
   }

}

ValidameController.java:

@Controller
@RequestMapping(value = "/validame")
public class ValidameController {

   @Autowired
   private ValidationManager validationManager;

   @RequestMapping(value = "/manual", method = RequestMethod.GET)
   public ResponseEntity<Boolean> pruebaValidacionManual(BeanValidado beanValido) {
      Errors errors = new BeanPropertyBindingResult(beanValido, "beanValido");
      validationManager.validate(errors, beanValido);
      return new ResponseEntity<Boolean>(!errors.hasErrors(), HttpStatus.OK);
   }

}

validationManager está definido de la siguiente manera en validation-config.xml:

<bean id="validationManager" class="com.ejie.x38.validation.ValidationManager" />

Si se realiza la siguiente llamada <servidor app>/validame/manual?unNumero=2&otroNumero=5 se puede observar el comportamiento indicado.

Saludos.

hmartinez85 commented 6 years ago

Hola,

Siguiendo el mismo ejemplo el validator me funciona correctamente, igual no tienes actualizado la última versión de x38.

image

Un saludo.

ma-santamaria commented 6 years ago

Hola,

actualmente estamos usando la versión 3.5; pero como comentaba al abrir la incidencia también hemos comprobado este comportamiento con la 3.2

El comportamiento erróneo se da cuando falla la validación; por ejemplo con otroNumero=5 y unNumero=2. En caso de que no falle no hay problema (por ejemplo con otroNumero=4 y unNumero=2), ya que no se intenta asociar los errores a ninguna propiedad del bean.

Saludos.

hmartinez85 commented 6 years ago

Correcto ya lo he visto en la siguiente versión estará corregido.

Un saludo