, , .
-, . . , , , , , .
, , , API . . . .
interface Validatable {
fun validate()
}
class ValidationErrorException(
val errors: List<ValidationError>
) : Exception() {
fun toValidationErrors() = ValidationErrors(errors)
}
data class ValidationErrors(
val errors : List<ValidationError>
)
data class ValidationError(
val path: String,
val message: String
)
. , javax.validation.Validation:
open class ValidatableJavax : Validatable {
companion object {
val validator = Validation.buildDefaultValidatorFactory().validator!!
}
override fun validate() {
val violations = validator.validate(this)
val errors = violations.map {
ValidationError(it.propertyPath.toString(), it.message)
}.toMutableList()
if (errors.isNotEmpty()) {
throw ValidationErrorException(errors = errors)
}
}
}
, javax- kotlin - :
import javax.validation.constraints.Positive
class MyObject(
myNumber: BigDecimal
) : ValidatableJavax() {
@get:Positive(message = "Must be positive")
val myNumber: BigDecimal = myNumber
}