Hibernate javax.validation:接收错误';找不到类型为&x27;

Hibernate javax.validation:接收错误';找不到类型为&x27;,hibernate,bean-validation,hibernate-validator,Hibernate,Bean Validation,Hibernate Validator,框架:JQuery、Spring、Hibernate、Hibernate验证器(JSR-303bean验证) 平台:Windows 我试图使用JSR303bean验证定义一个自定义约束@IdMustExist。约束的目的是检查关联表中是否存在输入的id值。我收到错误“javax.validation.UnexpectedTypeException:找不到类型为com.mycompany.myapp.domain.package1.class1”的验证器 如果我将@IdMustExist放在Cla

框架:JQuery、Spring、Hibernate、Hibernate验证器(JSR-303bean验证)
平台:Windows

我试图使用JSR303bean验证定义一个自定义约束@IdMustExist。约束的目的是检查关联表中是否存在输入的id值。我收到错误“javax.validation.UnexpectedTypeException:找不到类型为com.mycompany.myapp.domain.package1.class1”的验证器

如果我将@IdMustExist放在Class1的字段定义上(如下面的示例代码所示),我将收到上述错误。但如果我在字符串字段上放置@IdMustExist约束,则不会收到上述错误。我的代码在IdMustExistValidator.java中崩溃。我不明白为什么Hibernate可以为'String'类找到验证器,而不能为域类'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";
}
@必需
@目标({方法,字段,注释类型})
@保留(运行时)
@约束(validatedBy=IdMustExistValidator.class)
@记录
@报告违规行为
public@interface IdMustExist{
String message()默认值“{com.mycompany.myapp.domain.validation.constraints.idmustexist}”;
类[]组()默认值{};
类实体();
/**
*要验证其存在性的实体的属性。默认值为“id”
*/
字符串idProperty()默认为“id”;
}
IdMustExistValidator.java(请注意,该类设计存在bug)

公共类IdMustExistValidator实现ConstraintValidator{
/**
*检索实体类名称和id属性名称
*/
公共void初始化(IdMustExist IdMustExist){
if(idMustExist.entity()!=null)
entity=idMustExist.entity();
idProperty=idMustExist.idProperty();
}
/**
*检索给定实体类和id属性的实体。
*如果实体可用,则返回true,否则返回false
*/
公共布尔值有效(可序列化属性,ConstraintValidatorContext cvContext){
debug(“Property Class={}”,Property.getClass().getName());
debug(“Property={}”,Property);
List resultList=commonDao.getEntityById(entity.getName(),idProperty);
return resultList!=null&&resultList.size()>0;
}
私有阶级实体;
私有财产;
@自动连线
私有的公共道公共道;
私有最终记录器Logger=LoggerFactory.getLogger(IdMustExistValidator.class);

}

您的约束验证器被声明为验证可序列化的
值。

也许
Class2
不可
序列化

您是正确的。我的Class2没有实现Serializable。谢谢很多。应该实现可序列化接口的不是Class1吗?还是两个班?
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);