2011-01-23 9 views
5

フレームワーク:jQueryの、春、Hibernateは、Hibernateバリ(JSR-303ビーン検証)
プラットフォーム:Windowsのjavax.validation: 'NOバリデータが型に対して見つかりませんでした。' というエラーを受信

私がしようとしていますJSR 303-Bean Validationを使用してカスタム制約@IdMustExistを定義します。制約の目的は、入力されたid値が関連するテーブルに存在するかどうかをチェックすることです。 「javax.validation.UnexpectedTypeException:タイプ:com.mycompany.myapp.domain.package1.class1」のバリデータが見つかりませんでした。

Class1のフィールド定義に@IdMustExistを配置すると(上記のサンプルコードのとおり)、私は上記のエラーを受け取ります。しかし、Stringフィールドに@IdMustExist制約を置くと、上記のエラーは発生しません。 IdMustExistValidator.javaでコードがクラッシュする私はなぜHibernateが 'String'クラスのValidatorを見つけることができるのか理解していませんが、ドメインクラス 'Class1'は見つけられません。

私のクラス定義は次のとおりです。

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

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); 
(このクラスのデザインがバグを持っていることに注意してください)

}

答えて

4

制約バリデータは、Serializableの値を検証するために宣言されています。 おそらくClass2Serializableではありませんか?

+0

あなたは正しいですか?私のClass2はSerializableを実装していませんでした。ありがとう!たくさん。 – Jayaprakash

+1

Serializableインターフェイスを実装すべきClass1ではありませんか?または両方のクラス? – Stephane

関連する問題