17.3 Marshaller 与 Unmarshaller 的使用

Spring 的 OXM 可被用于十分广泛的场景。在以下的例子中,我们将使用这一功能将一个由 Spring 管理的应用程序的配置编组为一个 XML 文件。我们用了一个简单的 JavaBean 来表示这些配置:

public class Settings { 
    private boolean fooEnabled; 
    public boolean isFooEnabled() { 
        return fooEnabled; 
    } 
    public void setFooEnabled(boolean fooEnabled) { 
        this.fooEnabled = fooEnabled; 
    } 
} 

应用程序的主类使用这个 bean 来存放应用的配置信息。除了主要方法外,主类还包含下面两个方法:saveSettings() 将配置 bean 保存成一个名为 settings.xml 的文件, loadSettings() 则将配置信息从 XML 文件中读取出来。另有一个 main() 方法负责构建 Spring 应用上下文,并调用前述两个方法。

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.oxm.Marshaller; 
import org.springframework.oxm.Unmarshaller; 
public class Application { 
    private static final String FILE_NAME = "settings.xml"; 
    private Settings settings = new Settings(); 
    private Marshaller marshaller; 
    private Unmarshaller unmarshaller; 

    public void setMarshaller(Marshaller marshaller) { 
        this.marshaller = marshaller; 
    } 

    public void setUnmarshaller(Unmarshaller unmarshaller) { 
        this.unmarshaller = unmarshaller; 
    } 

    public void saveSettings() throws IOException { 
        FileOutputStream os = null; 
        try { 
            os = new FileOutputStream(FILE_NAME); 
            this.marshaller.marshal(settings, new StreamResult(os)); 
        } finally { 
            if (os != null) { 
                os.close(); 
            } 
        } 
    } 

    public void loadSettings() throws IOException { 
        FileInputStream is = null; 
        try { 
            is = new FileInputStream(FILE_NAME); 
            this.settings = (Settings) this.unmarshaller.unmarshal(new StreamSource(is)); 
        } finally { 
            if (is != null) { 
                is.close(); 
            } 
        } 
    } 

    public static void main(String[] args) throws IOException { 
        ApplicationContext appContext = 
                new ClassPathXmlApplicationContext("applicationContext.xml"); 
        Application application = (Application) appContext.getBean("application"); 
        application.saveSettings(); 
        application.loadSettings(); 
    } 
} 

需要将marshaller 和 unmarshaller 这两个属性赋值才能使 Application 正确运行。我们可以使用以下 applicationContext.xml 的内容来实现这一目的:

<beans> 
    <bean id="application" class="Application"> 
        <property name="marshaller" ref="castorMarshaller" /> 
        <property name="unmarshaller" ref="castorMarshaller" /> 
    </bean> 
    <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller"/> 
</beans> 

该应用中使用了 Castor 这一编组器实例,但我们可以使用在本章稍后描述的任何一个编组器实例来替换 Castor。Castor 默认并不需要任何进一步的配置,所以 bean 定义十分简洁。另外由于 CastorMarshaller 同时实现了 Marshaller 与 Unmarshaller 接口,所以我们可以同时把 castorMarshaller bean 赋值给应用的 marshaller 与 unmarshaller 属性。

此范例应用将会产生如下 settings.xml 文件:

<?xml version="1.0" encoding="UTF-8"?> 
<settings foo-enabled="false"/>