Jakiś czas temu szukając informacji o szybkiej konfiguracji springa oraz połączeniu go z JAXB natrafiłem na blog Michała Mecha (strona Michała nie jest już dostępna – tekst w wayback machine)który to opisywał wspomniany przeze mnie problem.

Udało mi się w miarę sprawnie przenieść przykład, który zaprezentował na „własne podwórko” i zamiast wstrzykiwać do beana scieżkę do pliku który miałbyć zamieniony poprzez JAXB na obiekt, mogłem wstrzykiwać gotowy obiekt, a bean jak zwykle po prostu nie był swiadom skąd się ten obiekt wziął – z xml’a, czy może ktoś bo sobie „poskładał” łącząc odpowiednio pojo z mappingu xml’owego. Pojawił się tylko mały zgrzyt w momencie, gdy okazało się, że takich podmionionych bean’ów mam 40…

Zacząłem szukać jakiegoś sposobu aby uprościć konfigurację i zamknąć wszystko w jednej linijce i faktycznie udało się wykorzystując poszczególne elementy:

  • dodając do konfiga xml’owego przestrzeń nazw oxm
  • wykorzystując property editora
  • dodając element nadrzędny dla docelowego bean’a

Zmodyfikuje nieco oryginalny przykład w celu prezentacji rozwiązania:

Najpierw property editor w celu zamiany String’a na Source xml’owe:

package pl.bedkowski.test;

import java.beans.PropertyEditorSupport;
import java.io.File;

import javax.xml.transform.stream.StreamSource;

public class String2StreamSource extends PropertyEditorSupport {

	@Override
	public void setAsText(String filePath) {
		setValue(new StreamSource(new File(filePath)));
	}

}

No i kontekst apliacji:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:oxm="http://www.springframework.org/schema/oxm"

	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-1.5.xsd">

	<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
	  <property name="customEditors">
	    <map>
	      <entry key="javax.xml.transform.Source">
	        <bean class="pl.bedkowski.test.String2StreamSource"/>
	      </entry>
	    </map>
	  </property>
	</bean>

	<oxm:jaxb2-marshaller id="jaxb2Marshaller">
		<oxm:class-to-be-bound name="pl.michalmech.config.Config"/>
	</oxm:jaxb2-marshaller>

	<bean id="configParent"  class="pl.michalmech.config.Config" factory-bean="jaxb2Marshaller" factory-method="unmarshal" abstract="true" />

	<bean id="config1" parent="configParent">
		<constructor-arg value="config1.xml" />
	</bean>

	<bean id="config2" parent="configParent">
		<constructor-arg value="config2.xml" />
	</bean>

	<bean id="config3" parent="configParent">
		<constructor-arg value="config3.xml" />
	</bean>

	<bean id="config4" parent="configParent">
		<constructor-arg value="config4.xml" />
	</bean>

</beans>

Na początku może się wydawać, że to więcej jednak jeżeli odejmiemy te pare(-naście) linijek podczas każdej inicjalizacji bean’a dziedziczącego po „configParent”, podobnie do bean’ów z id’kami config1-config4.