Domanda

quadro: JQuery, Primavera, Hibernate, Hibernate Validator (JSR-303 Bean Validation)
Piattaforma: Windows

Sto cercando di definire un @IdMustExist vincolo personalizzato utilizzando JSR 303-Bean Validation. Lo scopo del vincolo è quello di verificare se il valore immesso id esiste nella tabella associata. Ricevo un 'javax.validation.UnexpectedTypeException: Nessun selettore potrebbe essere trovato per il tipo: com.mycompany.myapp.domain.package1.class1' errore.

Se posto @IdMustExist su una definizione di campo Class1 (come indicato nel seguente esempio di codice), che riceve l'errore precedente. Ma se io vincolo posto @IdMustExist su un campo di stringa, non ricevono l'errore precedente. Il mio codice si blocca in IdMustExistValidator.java. Non capisco perché Hibernate può 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);

}

È stato utile?

Soluzione

Il validatore vincolo è dichiarato a valori Serializable Convalida. Forse non è Class2 Serializable?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top