In the course of some nullability refinements along with #30576, it turns out that ThreadLocalTargetSource always initializes its NamedThreadLocal with a String that contains a null bean name. That bean name should be appended lazily in a toString() implementation instead.