As Rob Spoor answered in comments, everything is correct, NotNull works before validator.
first each validation takes place without throwing any errors, then all validation errors are collected and wrapped in a single ConstraintViolationException. That's why it has a set of violations. That's why when implementing a constraint validator, the first step is to return true if the thing to validate is null. If it shouldn't be null then let @NotNull handle that.