2012-09-24 6 views
2

나는 다음과 같은 자바 객체 계층 구조가 있습니다XML 속성에 따라 다른 클래스에 매핑하도록 XStream을 구성하는 방법은 무엇입니까?

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 인스턴스를 생성 할 수 있습니다 : I가 XStream을 사용하고

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

사용자 -을 OX을-지도 정의 된 XML을 Java POJO로 변환합니다. 문제는

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

, 나는 논리 XStream을을 구성 할 필요가 말한다 : 저는 현재는 자바 클래스가 function 요소에 결합하는 것을 알 수 있도록 별칭을 가진 XStream 매퍼를 구성하기 위해 노력하고있어 * function/type 경우 ConstantFunction이면 oxmapper.alias("function", ConstantFunction.class)을 사용하십시오. 값이 LinearFunction이면 oxmapper.alias("function", LinearFunction.class)을 사용하십시오.

문제는 XStream API에서 제공하는이 로직을 구현하기 위해 XML을 검사하는 방법을 제공하지 않는다고 생각합니다. 내가 틀렸다면, 올바른 방향으로 나를 가리켜주세요!

난 다음 내가 생각할 수있는 유일한 해결책은 그래서 같은 모든 Function concretions의 조합 형성하는 정말 불쾌한 "뒤죽박죽"클래스를 가지고 올바른 것입니다 경우 :에서

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 - 매퍼 설정 :

,369 :

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

지금, 나는 MyApp 인스턴스로 XML 인스턴스를 읽을 때마다, 나는 변환을 수정해야

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

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

app.setFunction(concretion); 

이것은 내가 해결할 수있는 유일한 해결 방법이지만, 실제로는 더러운 느낌이 들며, 더 나은 방법이 있다고 생각합니다. 미리 감사드립니다!

답변

0

XStream에서 사용자 지정 동작을 사용하려면 Converter tutorial에 설명 된대로 변환기를 사용해야합니다.