该Github项目能够实现各种校验、数据格式转换和过滤转换等各种业务规则的处理。
验证:
使用Validation验证输入的错误数据,过滤掉不良数据。
例如,您可以验证电子邮件字段。
data class Person( val email: String ): Thing<Person> { override val rule: Rule<Person> get() = Rule { Validation { Person::email { email() } } } }
|
然后运行validate函数,返回验证的结果。
val person = Person( email = "kciter@naver" ) println(person.validate()) // ValidationResult.Invalid(dataPath=.email, message=must be a valid email address)
|
你也可以根据验证结果使用不同的逻辑。
val result = person.validate() when (result) { is ValidationResult.Valid -> { /* ... */ } is ValidationResult.Invalid -> { /* ... */ } }
|
数据规范化
数据经常以错误的形式出现在我们面前。有时,如果它非常不同,这是不可避免的,但有时稍加调整就能把它变成正确的规范结构。在这些情况下,你可以使用规范化Normalization。
data class Login( val email: String, val password: String ): Thing<Person> { override val rule: Rule<Login> get() = Rule { Normalization { Login::email { trim() } Login::password { trim() } } } }
|
然后运行normalize 函数,将数据改为正确的形式。
val loginData = Login( email = " kciter@naver.com ", password = "1q2w3e4r!" ) println(loginData.normalize()) // Login(email=kciter@naver.com, password=1q2w3e4r!)
|
Redaction
有时有一些你不想显示的信息。在这种情况下,我们可以使用 "Redaction"。
例如,卡的信息可能是敏感的,所以在规则中写一个条件,如果creditCard字段包含卡的信息,就进行编辑。
data class Foo( val creditCard: String ): Thing<Person> { override val rule: Rule<Foo> get() = Rule { Redaction { Foo::creditCard { creditCard() } } } }
|
运行redact函数,将数据改为[REDACTED]。
val foo = Foo( creditCard = "1234-1234-1234-1234" )
foo.redact() println(foo) // Foo(creditCard=[REDACTED])
|
使用Spring Boot
如果你想把Spring Boot和Thing一起使用,你可以使用thing-spring。
implementation("so.kciter:thing:{version}") implementation("so.kciter:thing-spring:{version}")
|
你可以在Bean Validation(JSR-380)中使用@ThingHandler注解而不是@Validated注解。
如果控制器包含@ThingHandler注解,ThingPostProcessor会在函数执行时检查是否存在一个Thing对象。如果存在一个Thing对象,它将在运行函数之前将其规范化,然后进行验证。而当我们返回结果时,如果它是一个Thing对象,我们会在编辑后返回它。
@ThingHandler @RestController @RequestMapping("/api") class ApiController { @PostMapping fun createPerson(@RequestBody person: Person): AnyResponse { /* ... */ } }
|
Bean验证
Bean Validation 是一个很棒的库。但是,它并不适用于所有情况。例如,如果您想规范化或编辑数据,则无法使用 Bean Validation。在这种情况下,您可以使用 Thing。
更多点击标题