HV000030:找不到约束验证器(休眠验证器)

时间:2018-11-17 23:45:56

标签: spring hibernate-validator

我正在遵循此tutorial来创建具有多个参数的自定义验证,但是在执行@PostMapping方法时遇到以下异常:

  

HV000030:找不到约束'com.crimsonlogic.anotaciones.TimeRangeConstraints'验证类型为'com.crimsonlogic.model.NuevoEvento'的验证器。检查''

的配置

引起我注意的是,在“检查配置”中,该信息没有告诉我任何信息。

NuevoEvento类:

@TimeRangeConstraints.List({
@TimeRangeConstraints(
    fechaEvento="fechaEvento",
    horaInicio="horaInicio",
    horaCulminacion="horaCulminacion"
)
})
public class NuevoEvento {
@NotNull(message="Como se llamara el evento?")
@Size(max=40, message="Titulo invalido")
private String titulo;
@NotNull(message="Seleccione un tipo.")
private String tipoEvento;
private String url;
@NotNull(message="Seleccione la fecha del evento")
private String fechaEvento;
@NotNull(message="A que hora inicia el evento?")
private String horaInicio;
@NotBlank(message="A que hora termina el evento?")
private String horaCulminacion;
@NotNull(message="Seleccione un salon.")
private int salonId;

public NuevoEvento() {}

public String getTitulo() {
    return titulo;
}

public void setTitulo(String titulo) {
    this.titulo = titulo;
}

public String getTipoEvento() {
    return tipoEvento;
}

public void setTipoEvento(String tipoEvento) {
    this.tipoEvento = tipoEvento;
}

public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}

public String getFechaEvento() {
    return fechaEvento;
}

public void setFechaEvento(String fechaEvento) {
    this.fechaEvento = fechaEvento;
}

public String getHoraInicio() {
    return horaInicio;
}

public void setHoraInicio(String horaInicio) {
    this.horaInicio = horaInicio;
}

public String getHoraCulminacion() {
    return horaCulminacion;
}

public void setHoraCulminacion(String horaCulminacion) {
    this.horaCulminacion = horaCulminacion;
}

public int getSalonId() {
    return salonId;
}

public void setSalon(int salon) {
    this.salonId = salon;
}
}

TimeRangeConstraint批注:

@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy= TimeRangeValidator.class)
public @interface TimeRangeConstraints {
String fechaEvento();
String horaInicio();
String horaCulminacion();
String message() default "El rango de tiempo establecido no es valido o esta ocupado.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface List {
    TimeRangeConstraints[] value();
}
}

有人知道这个问题的原因吗?

1 个答案:

答案 0 :(得分:0)

我发现了问题。

在我的TimeRangeValidator类中,我的代码如下:

//HERE WAS THE PROBLEM 
public class TimeRangeValidator implements ConstraintValidator<TimeRangeConstraints,String> { 
//--------------------------------------------------------------------------------->

    private String fechaEvento;
    private String horaInicial;
    private String horaFinal;
    @Autowired
    private UsuarioSalonRepository usuarioSalon;

    @Override
    public void initialize(TimeRangeConstraints constraintAnnotation) {
        this.fechaEvento = constraintAnnotation.fechaEvento();
        this.horaInicial = constraintAnnotation.horaInicio();
        this.horaFinal = constraintAnnotation.horaCulminacion();
    }
    //// MORE AND MOREEE CODE....////

我必须用 Object

替换字符串
public class TimeRangeValidator implements ConstraintValidator<TimeRangeConstraints,Object>

,问题消失了。

对于那些不了解发生了什么的人的更深入的解释

TimeRangeValidator从表单中获取3个字段以执行验证逻辑。由于以下原因,以前更改的值使我无法使用表单的3个字段:

@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
    Object dt = new BeanWrapperImpl(value).getPropertyValue(fechaEvento);
    Object hInit = new BeanWrapperImpl(value).getPropertyValue(horaInicial);
    Object hFin = new BeanWrapperImpl(value).getPropertyValue(horaFinal);
    SimpleDateFormat form = new SimpleDateFormat("yyyy-MM-dd");
    try {
        Date dia = form.parse(dt.toString().replaceAll("/","-"));
        return TimeUtils.detectOverlappingEvents(usuarioSalon.buscarEvento(dia), 
                hInit.toString().replaceAll("\\s","")+":00", 
                hFin.toString().replaceAll("\\s","")+":00");
    } catch (ParseException e) {
        e.printStackTrace();
        return false;
    }

使用类型对象,我可以(在BeanWrapperImpl的帮助下)获取表单的多个值以对其进行验证。

通常,使用String(或Integer,无论如何)类型来验证表单的单个值。