diff --git a/src/main/java/xyz/zhouxy/plusone/commons/domain/ValidatableStringRecord.java b/src/main/java/xyz/zhouxy/plusone/commons/domain/ValidatableStringRecord.java new file mode 100644 index 0000000..76cb3cd --- /dev/null +++ b/src/main/java/xyz/zhouxy/plusone/commons/domain/ValidatableStringRecord.java @@ -0,0 +1,55 @@ +/* + * Copyright 2022-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package xyz.zhouxy.plusone.commons.domain; + +import java.util.regex.Pattern; + +import com.fasterxml.jackson.annotation.JsonValue; + +import xyz.zhouxy.plusone.commons.util.Assert; + +/** + * 带校验的字符串值对象 + * + * @author ZhouXY + * @since 0.1.0 + */ +public abstract class ValidatableStringRecord { + private final String value; + + protected ValidatableStringRecord(String value, Pattern pattern) { + Assert.notNull(pattern, "The pattern must not be null."); + Assert.hasText(value, "The value must be has text."); + Assert.isTrue(pattern.matcher(value).matches()); + this.value = value; + } + + /** + * 值对象的字符串值。 + * + * @return 字符串(不为空) + */ + @JsonValue + public final String value() { + return this.value; + } + + @Override + public String toString() { + return this.value(); + } +} diff --git a/src/test/java/xyz/zhouxy/plusone/commons/domain/ValidatableStringRecordTests.java b/src/test/java/xyz/zhouxy/plusone/commons/domain/ValidatableStringRecordTests.java new file mode 100644 index 0000000..a21170e --- /dev/null +++ b/src/test/java/xyz/zhouxy/plusone/commons/domain/ValidatableStringRecordTests.java @@ -0,0 +1,37 @@ +package xyz.zhouxy.plusone.commons.domain; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import xyz.zhouxy.plusone.commons.annotation.StaticFactoryMethod; +import xyz.zhouxy.plusone.commons.annotation.ValueObject; +import xyz.zhouxy.plusone.commons.constant.PatternConsts; + +class ValidatableStringRecordTests { + + private static final Logger log = LoggerFactory.getLogger(ValidatableStringRecordTests.class); + + @Test + void test() { + Username username = Username.of("ZhouXY"); + assertNotNull(username); + String usernameStr = username.value(); + assertNotNull(usernameStr); + log.info("usernameStr: {}", usernameStr); + } +} + +@ValueObject +class Username extends ValidatableStringRecord { + private Username(String username) { + super(username, PatternConsts.USERNAME); + } + + @StaticFactoryMethod(Username.class) + public static Username of(String username) { + return new Username(username); + } +}