Generalized URL resolution and canonicalization: interface + injectable beans instead of static methods