I ran into a performance issue with Java Bean Validation (Hibernate Validator) on a large object, which caused the validation to run several orders slower. I was able to isolate and reproduce it with the following example code: Example DTOsLet's say we have a Order with Items:
The Items look like this:
Bean Validation and BenchmarkLet's create an order with 20000 items, and benchmark how long it takes to validate it (while also verifying that it is validated):
Benchmark times:
The issueObviously, the @Valid annotations on the Item id (Long) and quantity (int) are obsolete (this annotation hints that the validation should recurse into a bean or collection, which neither of these values are). If I remove them and run the validation benchmark again, the times look good (while still having the correct validation outcome):
This basically affects all value objects, where a @Valid was annotated:
- String and Character
- all Number classes (Integer, Long, …, BigInteger, BigDecimal)
- all enum types
- Java Date/Time value objects (LocalDate, LocalTime, LocalDateTime, OffsetDateTime, …)
- other Java value objects ( UUID, InetAddress, …)
The performance impact is non-linear, and seems to grow exponentially with the number of items in that list. Expectation: the @Valid should be ignored for Java-internal value objects (as listed above), as it is obsolete, and has a critical performance impact. |