У меня есть класс-оболочка со свойством, тип которого является суперклассом нескольких подклассов. Я хочу выполнить маршалинг в JSON и назначить подкласс для этого поля. Когда я это делаю, я получаю сообщение об ошибке:
java.lang.IllegalStateException: недопустимое пространство имен JSON: http://www.w3.org/2001/XMLSchema-instance
В частности, у меня есть класс "Wrapper" с полем "result" типа SuperClass, но он всегда будет экземпляром некоторого подкласса (ниже "SubClass"). Если я сделаю, чтобы у моего класса Wrapper было поле «result», определенное как тип подкласса «SubClass», оно работает нормально, но когда оно имеет тип «SuperClass», но экземпляр SubClass, я получаю ошибку.
Есть ли аннотация, которую я могу использовать здесь? Должен ли я сделать своего рода маршаллер?
public class JsonText {
@XmlRootElement
public static class SuperClass {
}
@XmlRootElement
public static class SubClass extends SuperClass {
private int val;
public int getVal() {return val; }
public void setVal(int i) {
val = i;
}
}
@XmlRootElement
public static class ErrorMessage {
private String msg;
public String getMsg() { return msg; }
public void setMsg(String s) { msg = s;}
}
@XmlRootElement
public static class Wrapper {
private SuperClass result;
private ErrorMessage error;
public SuperClass getResult() { return result; }
public void setResult(SuperClass sc) { result = sc; }
public ErrorMessage getError() { return error; }
public void setError(ErrorMessage e) { error = e; }
}
public static void main(String[] args) throws Exception{
ErrorMessage err = new ErrorMessage();
err.setMsg("my error");
SubClass sc = new SubClass();
sc.setVal(1);
Wrapper wrapper = new Wrapper();
wrapper.setResult(sc);
wrapper.setError(err);
JAXBContext jc = JAXBContext.newInstance(SuperClass.class, SubClass.class, Wrapper.class);
Configuration config = new Configuration();
MappedNamespaceConvention con = new MappedNamespaceConvention config);
StringWriter writer = new StringWriter();
XMLStreamWriter xmlStreamWriter = new MappedXMLStreamWriter(con, writer);
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(wrapper, xmlStreamWriter);
System.out.println(writer.toString());
}
}