HV000030: не найден валидатор для ограничения (Hibernate Validator) - PullRequest
0 голосов
/ 18 ноября 2018

Я следовал этому учебнику для создания настраиваемой проверки с несколькими параметрами, но я получаю следующее исключение при выполнении метода @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 голосов
/ 18 ноября 2018

Я обнаружил проблему.

В моем классе 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....////

Мне пришлось заменить строку на Объект

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, что угодно).

...