Hibernate Validator异常“找不到类型为:java.lang.String的验证器”。 [英] Hibernate Validator exception "No validator could be found for type: java.lang.String."

查看:555
本文介绍了Hibernate Validator异常“找不到类型为: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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆