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