フレームワーク: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);
(このクラスのデザインがバグを持っていることに注意してください)
}
あなたは正しいですか?私のClass2はSerializableを実装していませんでした。ありがとう!たくさん。 – Jayaprakash
Serializableインターフェイスを実装すべきClass1ではありませんか?または両方のクラス? – Stephane