Blog

 

 Tagcloud

 Kalendář akcí

 Twitter

 
3. září
2012

CXF a NotWritablePropertyException ve Spring

Autor: Martin Strejc | upraveno: 26. 9. 2012 | štítky: Spring, CXF, Exception, LazyInit

Zdá se to nemožné, ale při kombinaci používání Apache CXF pro webové služby a současně Spring Core a jakéhokoliv jeho nadstavby může dojít k výjimce.

Jak výjimku způsobit?

Výjimka vznikne při následující kombinaci:

  • V Eclipse zapnete CXF Facets, což způsobí, že do build path se přidá cesta k CXF
  • Použijete v definičním souboru bean
  • V bean voláte JNDI parametr
    • applicationContext.xml

      <bean id="myBean" class="com.etnetera.projects.example.MyBean">
         <property name="testParam">
            <jee:jndi-lookup jndi-name="config-test-param"/>
         </property>
      </bean>

      I přes fakt, že config-test-param máte definovanou na úrovni serveru, např. Tomcat, dojde k naprosto záhadné výjimce: org.springframework.beans.NotWritablePropertyException: Invalid property 'lazyInit' of bean class [org.springframework.jndi.JndiObjectFactoryBean]: Bean property 'lazyInit' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

      Co na to Google?

      Prý je to chyba v nějaké konkrétní verzi.

      Skutečná příčina

      Jakási třída dodaná společně s balíkem CXF může funkčně kolidovat se Spring, pokud používáte Maven, Ivy nebo další nástroj pro řešení závislostí, který dotáhne jiné verze knihoven.

      Řešení

      Vypněte CXF Facet, ještě pak musíte v Build Path ručně odstranit CXF. Jinak hodně štěstíl, trvalo mi několik hodin debugování, než jsem tohle objevil úplně náhodou.