Моя проблема кажется довольно простой, но я не смог найти ничего похожего на stackoverflow.
Я использую jaxb для маршалла / демаршаллинга этого объекта:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "root")
public class MyJaxbObject implements Serializable
{
@XmlElement(name = "DELETE")
@XmlJavaTypeAdapter(BooleanIntAdapter.class)
private Boolean delete;
@XmlElement(name = "message")
private String message;
constructors.. getters... setters...
}
Мой BooleanAdapter - это простой XmlAdapter<Integer, Boolean>
, который превращает истину / ложь в 1/0 и обратно.
Немаршаллинг работает, а маршаллинг - нет. это всегда приводит к этому:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<DELETE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.or/2001/XMLSchema" xsi:type="xs:boolean">true</DELETE>
<message>***DONE***</message>
</root>
Когда я изменяю конфигурацию элемента xml на @XmlElement(name = "DELETE",type = Boolean.class)
сбой демаршаллинга логического значения, и маршаллинг дает это:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<DELETE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:int">1</DELETE>
<message>***DONE***</message>
</root>
Я поместил простые печатные сообщения в методы маршала / демаршала адаптера xml и попытался маршалировать / демаршировать этот тип объекта.
Я видел, что без объявления типа вызывается unmarshal метод, а marshal - нет.
С объявлением типа вызывается только маршал.
Помощь ??
Как я могу выполнить маршалинг / демаршалирование моего логического значения в / из {1,0} и, возможно, избавиться от типа xsi: type в маршаллированном xml?
Редактировать - это код, который я использовал для проверки маршала / демаршала:
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
JAXBContext context = javax.xml.bind.JAXBContext.newInstance("my.package.classes");
Unmarshaller unmarshal = context.createUnmarshaller();
Marshaller marshal = context.createMarshaller();
marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
String str = "<root><DELETE>1</DELETE><message>***DONE***</message></root>";
DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();
Document d = null;
d = builder.parse(new InputSource(new StringReader(str)));
MyJaxbObject myJaxUnmarsh = unmarshal.unmarshal(d.getFirstChild(), MyJaxbObject.class).getValue();
System.out.println(myJaxUnmarsh.getMessage() + " , " + myJaxUnmarsh.getDelete());
MyJaxbObject myJax = new MyJaxbObject();
myJax.setDelete(true);
myJax.setMessage("***DONE***");
marshal.marshal(myJax, System.out);