나는 다음과 같은 자바 객체 계층 구조가 있습니다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 내부를 정의하여 ConstantFunction
및 LinearFunction
인스턴스를 생성 할 수 있습니다 : 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);
이것은 내가 해결할 수있는 유일한 해결 방법이지만, 실제로는 더러운 느낌이 들며, 더 나은 방법이 있다고 생각합니다. 미리 감사드립니다!