GitHub - kciter/thing: 一个用 Kotlin 编写的基于规则的实体管理库


该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。

更多点击标题