2011-01-23 4 views
5

quadro: JQuery, Primavera, Hibernate, Hibernate Validator (JSR-303 Bean Validation)
Piattaforma: Windowsjavax.validation: riceverà un errore 'Nessun selettore potrebbe essere trovato per il tipo:'

sto cercando di definire un vincolo personalizzato @IdMustExist utilizzando JSR 303-Bean Validation. Lo scopo del vincolo è verificare se il valore id inserito esiste nella tabella associata. Sto ricevendo un errore 'javax.validation.UnexpectedTypeException: Impossibile trovare un validatore per tipo: com.mycompany.myapp.domain.package1.class1'.

Se inserisco @IdMustExist su una definizione di campo di Class1 (come indicato nel seguente codice di esempio), ricevo l'errore sopra riportato. Ma se inserisco il vincolo @IdMustExist su un campo String, non ricevo l'errore sopra riportato. Il mio codice si arresta in modo anomalo in IdMustExistValidator.java. Non capisco perché Hibernate possa trovare Validator per la classe 'String' ma non per la classe di dominio 'Class1'.

Le mie definizioni di classe sono le seguenti.

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 (Si prega di notare che questo disegno classe ha bug)

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); 

}

risposta

4

Il validatore di vincoli viene dichiarato per convalidare i valori Serializable. Forse Class2 non è Serializable?

+0

Sei corretto. My Class2 non ha implementato Serializable. Grazie! Un sacco. – Jayaprakash

+1

Non è la classe 1 che dovrebbe implementare l'interfaccia serializzabile? O entrambe le classi? – Stephane