Class FormBinder<T>
java.lang.Object
org.vaadin.firitin.form.FormBinder<T>
- Type Parameters:
T- The class/record type bound by this binder.
- All Implemented Interfaces:
com.vaadin.flow.component.HasValue<FormBinderValueChangeEvent<T>, T>, Serializable
public class FormBinder<T>
extends Object
implements com.vaadin.flow.component.HasValue<FormBinderValueChangeEvent<T>, T>
A new start for the
Binder.
Note, that this is still a fairly new class, so there might be API changes to it.
Design principles:
- Only support "non-buffered mode" so that validation logic can use the bean/record + simplicity of the implementation
- Validation is "just validation", and not concern of this class. BUT, API must support binding external validation logic, like Bean Validation API
- Must support Records and immutable objects as well
- No requirements for BeanValidation or Spring DataBinding stuff, but optional support (or extensible for those)
- Aiming for binding anything without property names (for good solution this needs to be resolved at language level and supported with thing like Bean Validation first)
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classNested classes/interfaces inherited from interface com.vaadin.flow.component.HasValue
com.vaadin.flow.component.HasValue.ValueChangeEvent<V>, com.vaadin.flow.component.HasValue.ValueChangeListener<E> -
Constructor Summary
ConstructorsConstructorDescriptionFormBinder(Class<T> tClass, com.vaadin.flow.component.Component... containerComponents) Constructs a new binder.FormBinder(Class<T> tClass, Object editorObject) Deprecated.not sure yet if this is a good idea, added for backwards compatibilityFormBinder(Class<T> tClass, Map<String, com.vaadin.flow.component.HasValue> propertyNameToEditor) Binds type to given property editorsFormBinder(tools.jackson.databind.introspect.BasicBeanDescription bdd) Constructs a new binder for semi-manual wiring.FormBinder(T dto, com.vaadin.flow.component.Component... containerComponents) Binds given dto to the UI fields found from given component(s). -
Method Summary
Modifier and TypeMethodDescriptioncom.vaadin.flow.shared.RegistrationaddValueChangeListener(com.vaadin.flow.component.HasValue.ValueChangeListener<? super FormBinderValueChangeEvent<T>> listener) voidbindProperty(tools.jackson.databind.introspect.BeanPropertyDefinition property, com.vaadin.flow.component.HasValue hasValue) Binds given property to the given editor field.voidRemoves all validation errors from bound fields andgetClassLevelViolationDisplay().protected voidconfigureEditor(tools.jackson.databind.introspect.BeanPropertyDefinition property, com.vaadin.flow.component.HasValue hasValue) protected Tprotected Tcom.vaadin.flow.component.HasComponentsGets the class level violation display.com.vaadin.flow.component.HasValueReturns a map containing input conversion errors (propertyname-error).Class<?>[]getValue()protected voidhandleClassLevelValidations(Set<jakarta.validation.ConstraintViolation<T>> violations) protected ObjecthandleInputConversionError(tools.jackson.databind.introspect.BeanPropertyDefinition property, com.vaadin.flow.data.binder.ValueContext ctx, String conversionErrorMsg) Handles input conversion error.booleanChecks if there have recently been errors to convert value from the UI to the domain object.protected booleanignoreRequiredConstraintForField(jakarta.validation.ConstraintViolation<T> cv, com.vaadin.flow.component.HasValue hasValue) By default, if a validation is "required" validation for a field that user has not touched, it is not reported in the UI, but is taken otherwise into accound.protected booleanbooleanprotected booleanisReadOnly(tools.jackson.databind.introspect.BeanPropertyDefinition property) protected booleanisRequired(tools.jackson.databind.introspect.BeanPropertyDefinition property) protected static booleanisRequired(tools.jackson.databind.introspect.BeanPropertyDefinition property, Class<?>[] activeGroups) booleanbooleanisValid()voidsetClassLevelValidationViolationComponentProvider(com.vaadin.flow.function.SerializableFunction<String, com.vaadin.flow.component.Component> classLevelValidationViolationComponentProvider) voidsetClassLevelViolationDisplay(com.vaadin.flow.component.HasComponents display) Sets the container component where "class level" constraint violations are displayed.voidsetConstraintViolations(Set<jakarta.validation.ConstraintViolation<T>> violations) Set the constraint violations found during validation.voidsetConverter(String property, com.vaadin.flow.data.converter.Converter<?, ?> strToDt) Sets a converter to use between the domain model property and the corresponding UI component editing it.voidsetIgnoreServerOriginatedChanges(boolean ignore) A flag to control whether server originated value change events should be ignored.voidsetRawConstraintViolations(Map<String, String> propertyToViolation) An alternative API to report constraint violations without BeanValidation API on the classpath.voidsetReadOnly(boolean readOnly) voidsetRequiredIndicatorVisible(boolean requiredIndicatorVisible) voidsetValidationGroups(Class<?>... groups) Sets the active validation groups.voidSets the value object bound to this formvoidunBind()Clears bindings, might be needed to clean up references if e.g. re-using fieldsMethods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface com.vaadin.flow.component.HasValue
bindReadOnly, bindRequiredIndicatorVisible, bindValue, clear, getEmptyValue, getOptionalValue, isEmpty
-
Constructor Details
-
FormBinder
Constructs a new binder.- Parameters:
tClass- the class of the bound entity/bean, set later withsetValue(Object)containerComponents- the components whose class contains the fields to bound
-
FormBinder
Deprecated.not sure yet if this is a good idea, added for backwards compatibilityConstructs a new binder.- Parameters:
tClass- the class of the bound entity/bean, set later withsetValue(Object)editorObject- the editor object that contains the fields to bound, does not need to be a component
-
FormBinder
-
FormBinder
public FormBinder(tools.jackson.databind.introspect.BasicBeanDescription bdd) Constructs a new binder for semi-manual wiring. Not designed for general use, but can be handy for some special cases. -
FormBinder
Binds given dto to the UI fields found from given component(s).- Parameters:
dto- the object to bind. The type of the FormBinder will be taken from this object.containerComponents- the components whose class contains the fields to bound
-
-
Method Details
-
setValidationGroups
Sets the active validation groups. This affects which fields show the required indicator based on their constraint annotations' group membership.- Parameters:
groups- the validation groups to activate
-
getValidationGroups
-
isRequired
protected boolean isRequired(tools.jackson.databind.introspect.BeanPropertyDefinition property) -
isRequired
protected static boolean isRequired(tools.jackson.databind.introspect.BeanPropertyDefinition property, Class<?>[] activeGroups) -
isReadOnly
protected boolean isReadOnly(tools.jackson.databind.introspect.BeanPropertyDefinition property) -
bindProperty
public void bindProperty(tools.jackson.databind.introspect.BeanPropertyDefinition property, com.vaadin.flow.component.HasValue hasValue) Binds given property to the given editor field.- Parameters:
property- the property to bindhasValue- the editor field to bind
-
configureEditor
protected void configureEditor(tools.jackson.databind.introspect.BeanPropertyDefinition property, com.vaadin.flow.component.HasValue hasValue) -
handleInputConversionError
protected Object handleInputConversionError(tools.jackson.databind.introspect.BeanPropertyDefinition property, com.vaadin.flow.data.binder.ValueContext ctx, String conversionErrorMsg) Handles input conversion error. By default, the error message saved and set to the field.- Parameters:
property-ctx-conversionErrorMsg-- Returns:
- the value to be set to the edited object, null by default
-
getValue
- Specified by:
getValuein interfacecom.vaadin.flow.component.HasValue<FormBinderValueChangeEvent<T>, T>
-
setValue
Sets the value object bound to this form- Specified by:
setValuein interfacecom.vaadin.flow.component.HasValue<FormBinderValueChangeEvent<T>, T>- Parameters:
valueObject- the new value
-
withValue
-
addValueChangeListener
public com.vaadin.flow.shared.Registration addValueChangeListener(com.vaadin.flow.component.HasValue.ValueChangeListener<? super FormBinderValueChangeEvent<T>> listener) - Specified by:
addValueChangeListenerin interfacecom.vaadin.flow.component.HasValue<FormBinderValueChangeEvent<T>, T>
-
isReadOnly
public boolean isReadOnly()- Specified by:
isReadOnlyin interfacecom.vaadin.flow.component.HasValue<FormBinderValueChangeEvent<T>, T>
-
setReadOnly
public void setReadOnly(boolean readOnly) - Specified by:
setReadOnlyin interfacecom.vaadin.flow.component.HasValue<FormBinderValueChangeEvent<T>, T>
-
isRequiredIndicatorVisible
public boolean isRequiredIndicatorVisible()- Specified by:
isRequiredIndicatorVisiblein interfacecom.vaadin.flow.component.HasValue<FormBinderValueChangeEvent<T>, T>
-
setRequiredIndicatorVisible
public void setRequiredIndicatorVisible(boolean requiredIndicatorVisible) - Specified by:
setRequiredIndicatorVisiblein interfacecom.vaadin.flow.component.HasValue<FormBinderValueChangeEvent<T>, T>
-
isImmutable
protected boolean isImmutable() -
constructRecord
-
constructPojo
-
setConstraintViolations
Set the constraint violations found during validation. If violation is bound to a bound property, it is shown next to the field, otherwise shown at "form level", seesetClassLevelViolationDisplay(HasComponents).- Parameters:
violations- the constraint violations that should be shown in the UI
-
ignoreRequiredConstraintForField
protected boolean ignoreRequiredConstraintForField(jakarta.validation.ConstraintViolation<T> cv, com.vaadin.flow.component.HasValue hasValue) By default, if a validation is "required" validation for a field that user has not touched, it is not reported in the UI, but is taken otherwise into accound.- Parameters:
cv- validation constrainghasValue- the field to be tested- Returns:
- true if should be ignored based on emptry validity
-
getClassLevelViolationDisplay
public com.vaadin.flow.component.HasComponents getClassLevelViolationDisplay()Gets the class level violation display. If not set, the first container component is used if of appropriate type.- Returns:
- the component where constraint violations will be displayed
-
setClassLevelViolationDisplay
public void setClassLevelViolationDisplay(com.vaadin.flow.component.HasComponents display) Sets the container component where "class level" constraint violations are displayed.- Parameters:
display- the component where the "class level" constraint violations will be displayed.
-
handleClassLevelValidations
-
setClassLevelValidationViolationComponentProvider
public void setClassLevelValidationViolationComponentProvider(com.vaadin.flow.function.SerializableFunction<String, com.vaadin.flow.component.Component> classLevelValidationViolationComponentProvider) -
setRawConstraintViolations
-
clearValidationErrors
public void clearValidationErrors()Removes all validation errors from bound fields andgetClassLevelViolationDisplay(). -
setConverter
Sets a converter to use between the domain model property and the corresponding UI component editing it.- Parameters:
property- the propertystrToDt- the converter
-
hasInputConversionErrors
public boolean hasInputConversionErrors()Checks if there have recently been errors to convert value from the UI to the domain object.- Returns:
- true if there are active conversion errors
-
getInputConversionErrors
-
isValid
public boolean isValid()- Returns:
- true if the binging looks valid for the user: no displayed constraint violations nor input conversion errors.
-
setIgnoreServerOriginatedChanges
public void setIgnoreServerOriginatedChanges(boolean ignore) A flag to control whether server originated value change events should be ignored. Currently only known to be needed for testing, might be removed in the future.- Parameters:
ignore- true if non-client originated events should be ignored
-
unBind
public void unBind()Clears bindings, might be needed to clean up references if e.g. re-using fields -
getBoundProperties
-
getEditor
-