in util-jackson/src/main/scala/com/twitter/util/jackson/caseclass/CaseClassDeserializer.scala [72:119]
private[this] def applyPropertyNamingStrategy(
config: DeserializationConfig,
fieldName: String
): String =
config.getPropertyNamingStrategy.nameForField(config, null, fieldName)
// Validate `Constraint` annotations for all fields.
def executeFieldValidations(
validatorOption: Option[ScalaValidator],
executableDescriptorOption: Option[ExecutableDescriptor],
config: DeserializationConfig,
constructorValues: Array[Object],
fields: Array[CaseClassField]
): Seq[CaseClassFieldMappingException] = (validatorOption, executableDescriptorOption) match {
case (Some(validator), Some(executableDescriptor)) =>
val violations: Set[ConstraintViolation[Any]] =
validator.forExecutables
.validateExecutableParameters[Any](
executableDescriptor,
constructorValues.asInstanceOf[Array[Any]],
fields.map(_.name)
)
if (violations.nonEmpty) {
val results = mutable.ListBuffer[CaseClassFieldMappingException]()
val iterator = violations.iterator
while (iterator.hasNext) {
val violation: ConstraintViolation[Any] = iterator.next()
results.append(
CaseClassFieldMappingException(
CaseClassFieldMappingException.PropertyPath.leaf(
applyPropertyNamingStrategy(config, violation.getPropertyPath.getLeafNode.toString)
),
CaseClassFieldMappingException.Reason(
message = violation.getMessage,
detail = ValidationError(
violation,
CaseClassFieldMappingException.ValidationError.Field,
violation.getDynamicPayload(classOf[Payload])
)
)
)
)
}
results.toSeq
} else Seq.empty[CaseClassFieldMappingException]
case _ =>
Seq.empty[CaseClassFieldMappingException]
}