Skip to content

Commit 9a16698

Browse files
committed
Update custom validator section #1028
1 parent 381bf0c commit 9a16698

5 files changed

Lines changed: 56 additions & 11 deletions

File tree

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.company.onboarding.validators;
2+
3+
import io.jmix.flowui.component.validation.AbstractValidator;
4+
import io.jmix.flowui.exception.ValidationException;
5+
import org.springframework.beans.factory.config.BeanDefinition;
6+
import org.springframework.context.annotation.Scope;
7+
import org.springframework.stereotype.Component;
8+
9+
import java.util.Map;
10+
11+
// tag::validator[]
12+
@Component
13+
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
14+
public class PostcodeValidator extends AbstractValidator<String> {
15+
16+
private static final String POSTCODE_REGEX =
17+
"^[A-Z]{1,2}[0-9][0-9A-Z]?\\s?[0-9][A-Z]{2}$";
18+
19+
@Override
20+
public void accept(String value) throws ValidationException {
21+
if (value != null && !value.matches(POSTCODE_REGEX)) {
22+
String errorMessage = getTemplateErrorMessage(message, Map.of("value", value));
23+
throw new ValidationException(errorMessage);
24+
}
25+
}
26+
}
27+
// end::validator[]

content/modules/flow-ui/examples/onboarding/src/main/java/com/company/onboarding/validators/ZipValidator.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,15 @@
22

33
import io.jmix.flowui.component.validation.Validator;
44
import io.jmix.flowui.exception.ValidationException;
5-
import org.springframework.beans.factory.config.BeanDefinition;
6-
import org.springframework.context.annotation.Scope;
75
import org.springframework.stereotype.Component;
86

97
// tag::ZipValidator[]
108
@Component
11-
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
129
public class ZipValidator implements Validator<String> {
1310
@Override
1411
public void accept(String value) throws ValidationException {
15-
if (value != null && value.length() != 6)
16-
throw new ValidationException("Zip must be of 6 characters length");
12+
if (value != null && value.length() != 5)
13+
throw new ValidationException("Zip code must consist of 5 characters");
1714
}
1815
}
1916
// end::ZipValidator[]

content/modules/flow-ui/examples/onboarding/src/main/java/com/company/onboarding/view/component/validator/ValidatorView.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ public void onInit(final InitEvent event) {
106106
private void addCustomValidator(){
107107
// tag::addCustomValidator[]
108108
zipField.addValidator(value -> {
109-
if (value != null && value.length() != 6)
110-
throw new ValidationException("Zip must be of 6 characters length");
109+
if (value != null && value.length() != 5)
110+
throw new ValidationException("Zip code must consist of 5 characters");
111111
});
112112
// end::addCustomValidator[]
113113
}

content/modules/flow-ui/examples/onboarding/src/main/resources/com/company/onboarding/view/component/validator/validator-view.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,17 @@
2121
</textField>
2222
<!-- end::zipField[] -->
2323
</vbox>
24+
<vbox>
25+
<label text="Custom 2:"/>
26+
<!-- tag::postcodeField[] -->
27+
<textField id="postcodeField" datatype="string">
28+
<validators>
29+
<custom bean="postcodeValidator"
30+
message="${value} is not a valid UK postcode"/>
31+
</validators>
32+
</textField>
33+
<!-- end::postcodeField[] -->
34+
</vbox>
2435
<vbox>
2536
<label text="DecimalMax:"/>
2637
<!-- tag::decimalMax[] -->

content/modules/flow-ui/pages/vc/miscellaneous/validator.adoc

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -623,22 +623,32 @@ include::example$/onboarding/src/main/java/com/company/onboarding/view/component
623623
[[custom-validator]]
624624
== Creating Custom Validators
625625

626-
A custom validator can be defined by a prototype bean implementing the `Validator` interface.
627-
628-
Example of creating a validator for zip codes:
626+
A custom validator can be defined by a Spring bean implementing the `Validator` interface. For example:
629627

630628
[source,java,indent=0]
631629
----
632630
include::example$/onboarding/src/main/java/com/company/onboarding/validators/ZipValidator.java[tags=ZipValidator]
633631
----
634632

635-
In a view XML descriptor, the custom validator should be defined in the nested `custom` element. For example:
633+
In a view XML descriptor, the custom validator should be defined in the nested `custom` element. The `bean` attribute should specify the validator bean name. For example:
636634

637635
[source,xml,indent=0]
638636
----
639637
include::example$/onboarding/src/main/resources/com/company/onboarding/view/component/validator/validator-view.xml[tags=zipField]
640638
----
641639

640+
You can extend a validator from the `AbstractValidator` base class. Then you can provide a message in XML and use the `getTemplateErrorMessage()` method to create an error message. In this case the bean will have a state (the message from XML), so it must be a prototype. For example:
641+
642+
[source,java,indent=0]
643+
----
644+
include::example$/onboarding/src/main/java/com/company/onboarding/validators/PostcodeValidator.java[tags=validator]
645+
----
646+
647+
[source,xml,indent=0]
648+
----
649+
include::example$/onboarding/src/main/resources/com/company/onboarding/view/component/validator/validator-view.xml[tags=postcodeField]
650+
----
651+
642652
A validator can also be defined by a lambda and added programmatically, for example:
643653

644654
[source,java,indent=0]

0 commit comments

Comments
 (0)