2012-09-24 55 views
2

我有以下的Java對象層次:如何配置XStream根據XML屬性映射到不同的類?

public interface Function { 
    public void calculate(long t); 
} 

public class ConstantFunction implements Function { 
    private double constant; 

    @Override 
    public void calculate(long t) { 
     // ... 
    } 
} 

public class LinearFunction implements Function { 
    private double slope; 

    private double yIntercept; 

    @Override 
    public void calculate(long t) { 
     // ... 
    } 
} 

用戶可以通過定義它們中的XML,像這樣創造ConstantFunctionLinearFunction實例:

<myapp> 
    <function type="ConstantFunction> 
     <!-- ... --> 
    </function> 
    <function type="LinearFunction> 
     <!-- ... --> 
    </function> 
</myapp> 

我使用XStream把OX地圖的用戶定義XML到Java POJO。目前,我想要配置XStream映射器別名,以便它知道什麼Java類綁定到function元素:

XStream oxmapper = new XStream(); 
oxmapper.alias("myapp", MyApp.class); 
oxmapper.alias("function", ???); 

的問題是,我需要用邏輯配置XStream的,上面寫着:*如果function/typeConstantFunction,然後使用oxmapper.alias("function", ConstantFunction.class);但如果其值爲LinearFunction,則使用oxmapper.alias("function", LinearFunction.class)

問題是,我不認爲XStream API提供了一種以我需要的方式檢查XML以實現此邏輯的方法。 如果我錯了,請指點我正確的方向!

如果我是正確的,那麼我能想到的唯一解決辦法是具有形成所有Function結核像這樣的工會真的很討厭的「大雜燴」類:

public class FunctionFactory implements Function { 
    private double constant; 
    private double slope; 
    private double yIntercept; 

    private Class<? extends Function> concreteClass; 

    @Override 
    public void calculate(long t) { 
     // Do nothing. This class is a workaround to limitations with XStream. 
     return; 
    } 
} 

在OX-映射配置:

oxampper.alias("function", FunctionFactory.class); 
oxmapper.aliasField("function", "type", "concreteClass"); 

現在,每當我讀到一個XML實例爲MyApp實例時,我需要糾正的轉換:

XStream oxmapper = getConfiguredMapper(); 
MyApp app = oxmapper.fromXml("<myapp>...</myapp>"); 

FunctionFactory factory = app.getFunction(); 
Function concretion = factory.getConcreteClass(); 

app.setFunction(concretion); 

這是我可以做的唯一解決方法,但它感覺真的很討厭,我不得不相信還有更好的方法來做到這一點。提前致謝!

回答

0

如果您想在XStream中具有自定義行爲,則應使用Converter tutorial中描述的轉換器。

相關問題