2011-01-23 8 views
5

Marco: jQuery, Spring, Hibernate, Hibernate Validator (JSR-303 Bean Validation)
Plataforma: Windowsjavax.validation: Recibe un error 'No se pudo encontrar validador para el tipo:'

Estoy tratando de define una restricción personalizada @IdMustExist usando JSR 303-Bean Validation. El propósito de la restricción es verificar si el valor de identificación ingresado existe en la tabla asociada. Recibo un error 'javax.validation.UnexpectedTypeException: 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 Clase 1 (como figura en el código de ejemplo a continuación), recibo el error anterior. Pero si coloco la restricción @IdMustExist en un campo String, no recibo el error anterior. Mi código se bloquea en IdMustExistValidator.java. No entiendo por qué Hibernate puede encontrar Validator para la clase 'String' pero no para la clase de dominio 'Class1'.

Las definiciones de mi clase son las siguientes.

Class2.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 esta clase de diseño 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); 

}

Respuesta

4

Su validador de constricción se declara para validar los valores Serializable. ¿Quizás Class2 no es Serializable?

+0

Estás en la correcta. Mi Class2 no implementó Serializable. ¡Gracias! mucho. – Jayaprakash

+1

¿No es la Class1 la que debe implementar la interfaz Serializable? ¿O ambas clases? – Stephane

Cuestiones relacionadas