2012-05-26 5 views
7

Ich benutze Spring und Spring MVC 3.1, Hibernate 3, Hibernate Validator 4.3.Hibernate Validator-Ausnahme "Es konnte kein Typ für den Typ" java.lang.String "gefunden werden."

Ich möchte meinen benutzerdefinierten Constraint-Validator hinzufügen, aber es scheint, dass mein Validator nicht aufgerufen wurde und immer "No validator konnte für type" Ausnahme gefunden werden. Habe ich einen Fehler gemacht? Ich habe ein großes Problem, diese Ausnahme immer zu bekommen

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) 

Aber wenn ich meine benutzerdefinierte Einschränkung Validator entfernen, funktioniert alles einwandfrei. Hier ist mein Code, könnten Sie helfen, die Quelle zu finden, die diese Ausnahme verursacht?

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; 

    ... 
} 

zusätzliche Anmerkung, habe ich hinzugefügt

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

xml zum Frühling

Antwort

10

Sie setzen die @ActorConstraint auf das Feld name die vom Typ ist String, während der Prüfer Typ ActorConstraintValidator mit Actor parametrisiert . Das heißt, es gibt keinen Validator für die @ActorConstraint Einschränkung und den Typ String.

+0

Dank Gunnar, habe ich ActorConstraintValidator Parameter auf String, Problem gelöst. – Matt