Hibernate Validator异常“找不到类型为:java.lang.String的验证器”。 [英] Hibernate Validator exception "No validator could be found for type: java.lang.String."
问题描述
我使用Spring和Spring MVC 3.1,Hibernate 3,Hibernate Validator 4.3。
我想添加自定义约束验证器,但似乎验证器没有调用并总是得到没有验证器可以找到类型异常。我犯了什么错误吗?
我总是遇到一个很大的问题,它总是得到这个异常:
javax.validation.UnexpectedTypeException:HV000030:没有验证器可以找到类型为:java.lang.String。在org.hibernate.validator.internal.engine.ConstraintTree.verifyResolveWasUnique(ConstraintTree.java:394)
在org.hibernate.validator.internal.engine.ConstraintTree.findMatchingValidatorClass(ConstraintTree.java:375)
但是,如果我删除自定义约束验证程序,则一切正常。
这里是我的代码,你能找到引起这个异常的源代码吗?
test.constraint.ActorConstraint
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = ActorConstraintValidator.class)
public @interface ActorConstraint {
String message()defaultActor已经存在于数据库中;
public abstract Class<?> [] groups()default {};
public abstract Class <?扩展了Payload> [] payload()default {};
}
test.constraint.ActorConstraintValidator
@Component
公共类ActorConstraintValidator实现ConstraintValidator< ActorConstraint,演员> {
@Autowired
私人ActorModel actorModel;
@Override
public void initialize(ActorConstraint arg0){
System.out.println(ActorConstraintValidator is initialized);
$ b @Override
public boolean isValid(Actor actor,ConstraintValidatorContext context){
boolean pass = true;
if(getActorModel()。isActorExist(actor.getName())){
pass = false;
}
返回通行证;
}
public ActorModel getActorModel(){
return actorModel;
}
public void setActorModel(ActorModel actorModel){
this.actorModel = actorModel;
test.entity.Actor
@Entity / *(findByName命名查询定义省略)* /
public class Actor实现Serializable {
public static final String NAMED_QUERY__FIND_ACTOR_BY_NAME =findActorByName;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private长ID;
@ActorConstraint
@NotEmpty
私人字符串名称;
@DateTimeFormat(ISO = ISO.DATE)
私人日期生日;
@Min(0)
@Max(300)
私有整数高度;
...
}
额外说明,我有加入
<豆ID = 验证 类= org.springframework.validation.beanvalidation.LocalValidatorFactoryBean/>
to spring xml
您将 @ActorConstraint
放入<$ c $>类型的字段 name
c> String ,而验证器类型 ActorConstraintValidator
通过 Actor
进行参数化。也就是说,对于 @ActorConstraint
约束没有验证器,并且输入 String
。
I use Spring and Spring MVC 3.1, Hibernate 3, Hibernate Validator 4.3.
I want to add my custom constraint validator, but it seems that my validator not called and always got "No validator could be found for type" exception. Did I make any mistake? I got a big problem of getting this exception always
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.lang.String.
at org.hibernate.validator.internal.engine.ConstraintTree.verifyResolveWasUnique(ConstraintTree.java:394)
at org.hibernate.validator.internal.engine.ConstraintTree.findMatchingValidatorClass(ConstraintTree.java:375)
But if I remove my custom constraint validator, everything works fine. Here is my code, could you help find the source to cause this exception?
test.constraint.ActorConstraint
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy=ActorConstraintValidator.class)
public @interface ActorConstraint {
String message() default "Actor already exists in database";
public abstract Class<?>[] groups() default {};
public abstract Class<? extends Payload>[] payload() default {};
}
test.constraint.ActorConstraintValidator
@Component
public class ActorConstraintValidator implements ConstraintValidator<ActorConstraint, Actor> {
@Autowired
private ActorModel actorModel;
@Override
public void initialize(ActorConstraint arg0) {
System.out.println("ActorConstraintValidator is initialized");
}
@Override
public boolean isValid(Actor actor, ConstraintValidatorContext context) {
boolean pass = true;
if (getActorModel().isActorExist(actor.getName()) ){
pass = false;
}
return pass;
}
public ActorModel getActorModel() {
return actorModel;
}
public void setActorModel(ActorModel actorModel) {
this.actorModel = actorModel;
}
}
test.entity.Actor
@Entity /*(findByName named query definition is omitted)*/
public class Actor implements Serializable {
public static final String NAMED_QUERY__FIND_ACTOR_BY_NAME = "findActorByName";
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ActorConstraint
@NotEmpty
private String name;
@DateTimeFormat(iso=ISO.DATE)
private Date birthday;
@Min(0)
@Max(300)
private Integer height;
...
}
extra note, I have added
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
to spring xml
You put the @ActorConstraint
to the field name
which is of type String
, while the validator type ActorConstraintValidator
is parametrized with Actor
. That is, there is no validator for the @ActorConstraint
constraint and type String
.
这篇关于Hibernate Validator异常“找不到类型为:java.lang.String的验证器”。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!