Nedávno jsem psal o autowiringu ve Springu. V diskuzi Karlos napsal, že mu autowiring nefunguje v Resinu. Měl pravdu, o čemž jsem se přesvědčil o pár dní později, když jsem chtěl aplikaci nasadit právě na Resinu. Chvíli jsem si lámal hlavu s tím čím by to mohlo být, ale věc jsme nakonec vyřešili tím, že jsme se autowiringu vzdali. Dnes jsem si našel chvilku a strávil jsem ji debugováním Springu, abych zjistil kde je chyba. Než vám prozradím řešení, zkuste se zamyslet čím to bylo. Autowiring normálně funguje v Tomcatu, Jetty, ale v Resinu ne. Čím by to tak mohlo být? Tak co už to máte? Musím se přiznat, že bez debuggeru bych na to nepřišel, napadaly mě všelijaké teorie, od nefunkční reflexe po specifické nastavení security.
Odpověď je, ale evidentní. Jde o špatný XML parser. Resin standardně používá svůj XML parser, který ignoruje default hodnoty u atributů. Takže, když ve Spring XML konfiguračním souboru nevyplníme atribut, Resin vrací jako jeho hodnotu prázdný řetězec místo default hodnoty dané XSD. Spring se tedy konfiguroval podle jiných hodnot, než jsme chtěli. Náprava je snadná, stačí používat standardní XML parser. Jak na to se dočtete zde. Pokud vám toto řešení nevyhovuje, musíte u všech beanů nadefinovat autowire atribut, tak aby nemusela být použita implicitní hodnota.
Na závěr mi nezbude nic jiného než si povzdychnout nad svojí nepoučitelností. Poté co jsem před pár lety bojoval se špatnou implementací XML parseru od Oraclu, mě mohlo napadnout, že u Caucho také podlehnou nutkání napsat si vlastní parser. Bohužel rovněž za cenu odchylek od standardu.