Pregunta

Marco: JQuery, Spring, Hibernate, Validador Hibernate (Validación de Bean JSR-303)
Plataforma: Windows

Estoy tratando de definir una restricción personalizada @IdMustexist usando la validación JSR 303-Bean. El propósito de la restricción es verificar si el valor de identificación ingresado existe en la tabla asociada. Estoy recibiendo un error 'javax.validation.unespectedTypeException: No se pudo encontrar un validador para el tipo: com.mycompany.myapp.domain.package1.class1'.

Si coloco @IDMustexist en una definición de campo de clase1 (como se indica en el código de ejemplo a continuación), recibo el error anterior. Pero si coloco la restricción de @IDMustexist en un campo de cadena, no recibo el error anterior. Mi código se bloquea en idmustexistValidator.java. No entiendo por qué Hibernate puede encontrar validador para la clase 'String' pero no para la clase de dominio 'Class1'.

Mis definiciones de clase son las siguientes.

Clase2.Java

@Entity
@Table
public class Class2 extends BaseEntity {
/**
 * Validation: Class1 Id must exist. 
 */ 
@ManyToOne
@JoinColumn(name="Class1Id")
@IdMustExist(entity=Class1.class)
private Class1 class1;

..

Idmustexist.java

@Required
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = IdMustExistValidator.class)
@Documented
@ReportAsSingleViolation
public @interface IdMustExist {
String message() default "{com.mycompany.myapp.domain.validation.constraints.idmustexist}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};

/**
 * The entity class that contains the id property.
 */
Class<?> entity();

/**
 * The property of the entity we want to validate for existence. Default value is "id"
 */
String idProperty() default "id";
}

IdmustexistValidator.java (tenga en cuenta que este diseño de clase tiene errores)

public class IdMustExistValidator implements ConstraintValidator<IdMustExist, Serializable> {

/**
 * Retrieve the entity class name and id property name
 */
public void initialize(IdMustExist idMustExist) {
    if (idMustExist.entity() != null) 
        entity = idMustExist.entity();
    idProperty = idMustExist.idProperty();
}

/**
 * Retrieve the entity for the given entity class and id property.
 * If the entity is available return true else false
 */
public boolean isValid(Serializable property, ConstraintValidatorContext cvContext) {
    logger.debug("Property Class = {}", property.getClass().getName());
    logger.debug("Property = {}", property);
    List resultList = commonDao.getEntityById(entity.getName(), idProperty);
    return resultList != null && resultList.size() > 0;
}

private Class<?> entity;
private String idProperty;

@Autowired
private CommonDao commonDao;
private final Logger logger = LoggerFactory.getLogger(IdMustExistValidator.class);

}

¿Fue útil?

Solución

Su validador de restricciones se declara para validar Serializable valores. Quizás Class2 no es Serializable?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top