@TatuLund answer is correct.
I just want to add a working example:
@Route("validate-example")
@PageTitle("Single Field Validation Example")
public class SingleFieldValidationView extends VerticalLayout {
private final Binder<FormData> binder = new Binder<>(FormData.class);
private Binder.Binding<FormData, Double> bindingQtaTot;
private final NumberField totQntField = new NumberField("Quantità totale");
private final Button btnCalcola = new Button("Calcola");
public SingleFieldValidationView() {
configureBinder();
configureButton();
add(totQntField, btnCalcola);
setPadding(true);
setSpacing(true);
}
@Data
private static class FormData {
private String descrizione;
private LocalDate dataCreazione;
private Double quantitaTotale;
}
private void configureBinder() {
FormData formData = new FormData();
binder.setBean(formData);
// Keep the binding reference to validate later
bindingQtaTot = binder.forField(totQntField)
.asRequired("La quantità è obbligatoria!")
.withValidator(q -> q != null && q > 0, "La quantità deve essere maggiore di zero")
.bind(FormData::getQuantitaTotale, FormData::setQuantitaTotale);
}
private void configureButton() {
btnCalcola.addClickListener(event -> {
log("Validazione quantità...");
BindingValidationStatus<Double> validationStatus = bindingQtaTot.validate();
if (validationStatus.isError()) {
String msg = validationStatus.getMessage().orElse("Errore di validazione");
Notification.show(msg, 3000, Notification.Position.MIDDLE);
log("Errore di validazione campo quantità: " + msg);
} else {
Double value = totQntField.getValue();
Notification.show("Quantità valida: " + value, 2000, Notification.Position.MIDDLE);
log("Quantità valida: " + value);
}
});
}
private void log(String msg) {
System.out.println("[SingleFieldValidationView] " + msg);
}
}