2012-05-26 40 views
7

Tôi sử dụng Spring và Spring MVC 3.1, Hibernate 3, Hibernate Validator 4.3.Ngoại lệ Hibernate Validator "Không thể tìm thấy trình xác nhận hợp lệ cho loại: java.lang.String."

Tôi muốn thêm trình xác thực ràng buộc tùy chỉnh của mình, nhưng có vẻ như trình xác thực của tôi không được gọi và luôn nhận được "Không có trình xác thực hợp lệ cho loại" ngoại lệ. Tôi đã phạm sai lầm sao? Tôi gặp vấn đề lớn khi nhận ngoại lệ này luôn là

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) 

Nhưng nếu tôi xóa trình xác thực ràng buộc tùy chỉnh, mọi thứ đều hoạt động tốt. Đây là mã của tôi, bạn có thể giúp tìm nguồn gây ra ngoại lệ này không?

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; 

    ... 
} 
thêm

lưu ý, tôi đã thêm

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

để mùa xuân xml

Trả lời

10

Bạn đặt @ActorConstraint đến lĩnh vực name đó là loại String, trong khi các loại validator ActorConstraintValidator được parametrized với Actor . Nghĩa là, không có trình xác nhận hợp lệ cho ràng buộc @ActorConstraint và loại String.

+0

Cảm ơn Gunnar, tôi đã thay đổi tham số ActorConstraintValidator thành Chuỗi, sự cố được giải quyết. – Matt

Các vấn đề liên quan