2012-05-26 14 views
7

Uso Spring and Spring MVC 3.1, Hibernate 3, Hibernate Validator 4.3.Excepción de Hibernate Validator "No se pudo encontrar un validador para el tipo: java.lang.String".

Quiero agregar mi validador de restricciones personalizado, pero parece que mi validador no llamó y siempre obtuvo la excepción "No se pudo encontrar el validador para el tipo". ¿Cometí algún error? Tengo un gran problema de conseguir esta excepción siempre

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) 

Pero si quito mi validador restricción personalizada, todo funciona bien. Aquí está mi código, ¿podría ayudar a encontrar la fuente para causar esta excepción?

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; 

    ... 
} 

nota adicional, he añadido

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 

a la primavera xml

Respuesta

10

Se pone el @ActorConstraint al campo name que es de tipo String, mientras que el tipo de validación ActorConstraintValidator es parametrizada con Actor . Es decir, no existe un validador para la restricción @ActorConstraint y escriba String.

+0

Gracias Gunnar, cambié el parámetro ActorConstraintValidator a Cadena, problema resuelto. – Matt

Cuestiones relacionadas