As we head into the summer months and longer days, we’ve got a new release of the Twitter CSL libraries.
We’ve introduced a new case class validation library (util/util-validator) based on the Jakarta Bean Validation specification. This library wraps the Hibernate Validator <https://hibernate.org/validator/>
__ reference implementation for validating case classes. Check out the user guide documentation!
finagle-http: Make handling of invalid URI consistent across client implementations. There are behavioral inconsistencies amongst the current HTTP client implementations:
Our HTTP/1.x clients allow for submitting requests that contain non-ASCII characters and invalid character encoded sequences, while our HTTP/2 clients will either mangle the URI and strip out non-ASCII characters within the Netty pipeline or result in an UnknownChannelException when attempting to parse invalid character encoded sequences. With this change, we now consistently propagate an InvalidUriException result, which is marked as NonRetryable for all HTTP client implementations. All HTTP server implementations maintain behavior of returning a 400 Bad Request response status, but now also correctly handle invalid character encoded sequences. fa58caab
No Changes
finatra-jackson: Do not enforce CaseClassDeserializer deserialization semantics for a field until after any deserializer annotation has been resolved. This fully allows a deserializer to specify how to deserialize a field completely independent of the CaseClassDeserializer requirements for fields. For example, if a user wanted to allow parsing of a JSON null value into a null field instance value, they could define a custom deserializer to do so and annotate the case class field with @JsonDeserialize(using = classOf[CustomNullableDeserializer]).
Additionally, we fix a bug in how String case class fields are handled when the incoming JSON is not a String-type. The current code incorrectly returns an empty string when the field value is parsed into Jackson ContainerNode or ObjectNode types and an incorrect toString representation for a PojoNode type. We now correctly represent the field value as a string in these cases to deserialize into the case class field. 715890a4
finatra-jackson: Properly handle Scala enumeration fields wrapped in an Option during deserialization failures in the CaseClassDeserializer#isScalaEnumerationType method. a6cb5a10
finatra (BREAKING API CHANGE): Update to use the new util/util-validator ScalaValidator for case class field validations. We’ve removed the custom Finatra c.t.finatra.validation.Validator and instead now use the c.t.util.validation.ScalaValidator. Constraint annotations and validator implementations now use the standard jakarta.validation API interface classes instead of any custom Finatra types. We’ve deprecated the custom Finatra constraints as they are duplicative of already existing “standard” or otherwise provided constraints and validators. Additionally, c.t.finatra.validation.ErrorCode is deprecated with no replacement. The same data carried can be obtained via the standard jakarta.validation.ConstraintViolation[T].
Adapting the Finatra framework to use the util/util-validator also includes the framework Jackson integration. We’re also taking this opportunity to clean up the error reporting interface of the CaseClassFieldMappingException to define a CaseClassFieldMappingException.Reason type to replace the usage of the (removed) ValidationResult.Invalid type. The Reason carries a message String as well as a CaseClassFieldMappingException.Detail which can be one of several possible types including a CaseClassFieldMappingException.ValidationError which carries any failed validation information including the emitted ConstraintViolation[T].
Lastly, we are deprecating support for JSON serialization/deserialization of JodaTime fields in case classes. This support will be dropped in an upcoming release. Users should prefer to use the JDK 8 java.time classes and we will be adding support for these types in the Finatra Jackson integration in the future. 0731782d
finatra-jackson: (BREAKING API CHANGE) JsonLogging should use the lazy Scala SLF4J logger and no longer return the passed in argument that’s logged as JSON. 67252f30