diff --git a/src/main/java/xyz/zhouxy/plusone/validator/BaseValidator.java b/src/main/java/xyz/zhouxy/plusone/validator/BaseValidator.java index 7262d8c..9564991 100644 --- a/src/main/java/xyz/zhouxy/plusone/validator/BaseValidator.java +++ b/src/main/java/xyz/zhouxy/plusone/validator/BaseValidator.java @@ -51,6 +51,12 @@ public abstract class BaseValidator { return validator; } + protected final > DefaultValidatorOfComparable ruleForComparable(Function getter) { + DefaultValidatorOfComparable validator = new DefaultValidatorOfComparable<>(getter); + this.rules.add(validator::validate); + return validator; + } + protected final IntValidator ruleForInt(Function getter) { IntValidator validator = new IntValidator<>(getter); this.rules.add(validator::validate); diff --git a/src/main/java/xyz/zhouxy/plusone/validator/DefaultValidatorOfComparable.java b/src/main/java/xyz/zhouxy/plusone/validator/DefaultValidatorOfComparable.java new file mode 100644 index 0000000..100fb20 --- /dev/null +++ b/src/main/java/xyz/zhouxy/plusone/validator/DefaultValidatorOfComparable.java @@ -0,0 +1,18 @@ +package xyz.zhouxy.plusone.validator; + +import java.util.function.Function; + +public class DefaultValidatorOfComparable< + TObj, + TProperty extends Comparable + > extends ValidatorOfComparable> { + + DefaultValidatorOfComparable(Function getter) { + super(getter); + } + + @Override + protected DefaultValidatorOfComparable thisObject() { + return this; + } +} diff --git a/src/main/java/xyz/zhouxy/plusone/validator/DoubleValidator.java b/src/main/java/xyz/zhouxy/plusone/validator/DoubleValidator.java index f2bbf4e..502f75a 100644 --- a/src/main/java/xyz/zhouxy/plusone/validator/DoubleValidator.java +++ b/src/main/java/xyz/zhouxy/plusone/validator/DoubleValidator.java @@ -3,7 +3,7 @@ package xyz.zhouxy.plusone.validator; import java.util.function.Function; import java.util.function.Supplier; -public class DoubleValidator extends BasePropertyValidator> { +public class DoubleValidator extends ValidatorOfComparable> { DoubleValidator(Function getter) { super(getter); diff --git a/src/main/java/xyz/zhouxy/plusone/validator/IntValidator.java b/src/main/java/xyz/zhouxy/plusone/validator/IntValidator.java index 1250f95..bb7b420 100644 --- a/src/main/java/xyz/zhouxy/plusone/validator/IntValidator.java +++ b/src/main/java/xyz/zhouxy/plusone/validator/IntValidator.java @@ -3,7 +3,7 @@ package xyz.zhouxy.plusone.validator; import java.util.function.Function; import java.util.function.Supplier; -public class IntValidator extends BasePropertyValidator> { +public class IntValidator extends ValidatorOfComparable> { IntValidator(Function getter) { super(getter); diff --git a/src/main/java/xyz/zhouxy/plusone/validator/LongValidator.java b/src/main/java/xyz/zhouxy/plusone/validator/LongValidator.java index ca6ff7a..d4f2483 100644 --- a/src/main/java/xyz/zhouxy/plusone/validator/LongValidator.java +++ b/src/main/java/xyz/zhouxy/plusone/validator/LongValidator.java @@ -3,7 +3,7 @@ package xyz.zhouxy.plusone.validator; import java.util.function.Function; import java.util.function.Supplier; -public class LongValidator extends BasePropertyValidator> { +public class LongValidator extends ValidatorOfComparable> { LongValidator(Function getter) { super(getter); diff --git a/src/main/java/xyz/zhouxy/plusone/validator/StringValidator.java b/src/main/java/xyz/zhouxy/plusone/validator/StringValidator.java index 6935c83..64d8b51 100644 --- a/src/main/java/xyz/zhouxy/plusone/validator/StringValidator.java +++ b/src/main/java/xyz/zhouxy/plusone/validator/StringValidator.java @@ -20,7 +20,7 @@ import xyz.zhouxy.plusone.commons.util.StringTools; * * @author ZhouXY */ -public class StringValidator extends BasePropertyValidator> { +public class StringValidator extends ValidatorOfComparable> { StringValidator(Function getter) { super(getter); diff --git a/src/main/java/xyz/zhouxy/plusone/validator/ValidatorOfComparable.java b/src/main/java/xyz/zhouxy/plusone/validator/ValidatorOfComparable.java new file mode 100644 index 0000000..6b6afa7 --- /dev/null +++ b/src/main/java/xyz/zhouxy/plusone/validator/ValidatorOfComparable.java @@ -0,0 +1,49 @@ +package xyz.zhouxy.plusone.validator; + +import java.util.function.Function; +import java.util.function.Supplier; + +import com.google.common.collect.Range; + +public abstract class ValidatorOfComparable< + TObj, + TProperty extends Comparable, + TPropertyValidator extends ValidatorOfComparable + > extends BasePropertyValidator { + + ValidatorOfComparable(Function getter) { + super(getter); + } + + public TPropertyValidator between(Range range) { + withRule(range::contains, convertExceptionCreator("The value is not in " + range.toString())); + return thisObject(); + } + + public TPropertyValidator between(Range range, String errMsg) { + withRule(range::contains, convertExceptionCreator(errMsg)); + return thisObject(); + } + + public TPropertyValidator between( + Range range, + Supplier exceptionCreator) { + withRule(range::contains, exceptionCreator); + return thisObject(); + } + + public TPropertyValidator between( + Range range, + Function exceptionCreator) { + withRule(range::contains, exceptionCreator); + return thisObject(); + } + + static Function convertExceptionCreator(String errMsg) { + return value -> new IllegalArgumentException(errMsg); + } + + static Function convertExceptionCreator(Supplier exceptionSupplier) { + return value -> exceptionSupplier.get(); + } +} diff --git a/src/test/java/xyz/zhouxy/plusone/validator/test/BaseValidatorTest.java b/src/test/java/xyz/zhouxy/plusone/validator/test/BaseValidatorTest.java index 9144d4f..4a7c1a2 100644 --- a/src/test/java/xyz/zhouxy/plusone/validator/test/BaseValidatorTest.java +++ b/src/test/java/xyz/zhouxy/plusone/validator/test/BaseValidatorTest.java @@ -1,5 +1,6 @@ package xyz.zhouxy.plusone.validator.test; +import java.time.Year; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -7,6 +8,8 @@ import java.util.Objects; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; +import com.google.common.collect.Range; + import xyz.zhouxy.plusone.commons.constant.PatternConsts; import xyz.zhouxy.plusone.commons.function.PredicateTools; import xyz.zhouxy.plusone.commons.util.RegexTools; @@ -19,7 +22,8 @@ class BaseValidatorTest { RegisterCommand registerCommand = new RegisterCommand("zhouxy108", "luquanlion@outlook.com", "22336", "A1b2C3d4", "A1b2C3d4", - Arrays.asList(new String[] { "admin", "editor" })); + Arrays.asList(new String[] { "admin", "editor" }), + 2000); RegisterCommandValidator.INSTANCE.validate(registerCommand); ValidTools.validate(registerCommand, RegisterCommandValidator.INSTANCE); System.out.println(registerCommand); @@ -30,6 +34,8 @@ class BaseValidatorTest { static final RegisterCommandValidator INSTANCE = new RegisterCommandValidator(); private RegisterCommandValidator() { + int thisYear = Year.now().getValue(); + ruleForString(RegisterCommand::getUsername) .isTrue(PredicateTools.from(Objects::nonNull) .and(StringUtils::isNotEmpty) @@ -48,6 +54,14 @@ class BaseValidatorTest { ruleForCollection(RegisterCommand::getRoles) .notEmpty(() -> new RuntimeException("角色列表不能为空")); + ruleForComparable(RegisterCommand::getYearOfBirth) + .notNull() + .between(Range.closed(thisYear - 60, thisYear - 18)); + + ruleForInt(RegisterCommand::getYearOfBirth) + .notNull() + .between(Range.closed(thisYear - 60, thisYear - 18)); + withRule(registerCommand -> Objects.equals(registerCommand.getPassword(), registerCommand.getPassword2()), "两次输入的密码不一致"); } @@ -65,17 +79,20 @@ class BaseValidatorTest { private String password2; private List roles; + private Integer yearOfBirth; + public RegisterCommand() { } public RegisterCommand(String username, String account, String code, String password, String password2, - List roles) { + List roles, Integer yearOfBirth) { this.username = username; this.account = account; this.code = code; this.password = password; this.password2 = password2; this.roles = roles; + this.yearOfBirth = yearOfBirth; } public String getUsername() { @@ -126,6 +143,14 @@ class BaseValidatorTest { this.roles = roles; } + public Integer getYearOfBirth() { + return yearOfBirth; + } + + public void setYearOfBirth(Integer yearOfBirth) { + this.yearOfBirth = yearOfBirth; + } + @Override public String toString() { return new StringBuilder() @@ -136,6 +161,7 @@ class BaseValidatorTest { .append(", password=").append(password) .append(", password2=").append(password2) .append(", roles=").append(roles) + .append(", yearOfBirth=").append(yearOfBirth) .append("]") .toString(); }