Может ли кто-нибудь помочь мне создать тег <Pty ID="ID1" Src="6" R="1">
, используя
EclipseLink MOXy @XmlPath
в одной аннотации.
Заранее большое спасибо.
Может ли кто-нибудь помочь мне создать тег <Pty ID="ID1" Src="6" R="1">
, используя
EclipseLink MOXy @XmlPath
в одной аннотации.
Заранее большое спасибо.
Я не уверен, что правильно понял ваши требования, но вот ответ на то, что, как я думаю, вы пытаетесь сделать.
Адаптер идентификаторов
Вы можете написать XmlAdapter
, чтобы преобразовать одно значение идентификатора в объект с несколькими свойствами. Эти другие свойства будут установлены со значениями по умолчанию.
package forum11965153;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class IdAdapter extends XmlAdapter<IdAdapter.AdaptedId, String> {
public static class AdaptedId {
@XmlAttribute(name="ID") public String id;
@XmlAttribute(name="Src") public String src = "6";
@XmlAttribute(name="R") public String r = "1";
}
@Override
public AdaptedId marshal(String string) throws Exception {
AdaptedId adaptedId = new AdaptedId();
adaptedId.id = string;
return adaptedId;
}
@Override
public String unmarshal(AdaptedId adaptedId) throws Exception {
return adaptedId.id;
}
}
Пти
Аннотация @XmlJavaTypeAdapter
используется для указания XmlAdapter
. Чтобы значения были объединены в корневой элемент, используется аннотация MOXy @XmlPath(".")
(см.: http://blog.bdoughan.com/2010/07/xpath-based-mapping.html).
package forum11965153;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement(name="Pty")
@XmlAccessorType(XmlAccessType.FIELD)
public class Pty {
@XmlJavaTypeAdapter(IdAdapter.class)
@XmlPath(".")
String id;
}
jaxb.properties
Как вы знаете, чтобы указать MOXy в качестве поставщика JAXB, вам необходимо включить файл с именем jaxb.properties
в тот же пакет, что и ваша модель домена, со следующей записью (см.: http://blog.bdoughan.com/search/label/jaxb.properties)
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Демо
Чтобы убедиться, что все работает, можно использовать следующий демонстрационный код:
package forum11965153;
import java.io.StringReader;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Pty.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StringReader xml = new StringReader("<Pty ID='ID1' Src='6' R='1'/>");
Pty pty = (Pty) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(pty, System.out);
}
}
Вывод
Ниже приведен результат запуска демо-кода:
<?xml version="1.0" encoding="UTF-8"?>
<Pty ID="ID1" Src="6" R="1"/>
@XmlPath
, как показано ниже. Система имеет только значение идентификатора, основанное на значении идентификатора в одном теге, мне нужно установить значение по умолчанию для атрибутов Src и R. ` ‹Pty ID=ID1 Src=6 R=1› ‹Sub ID=ID1 Typ=1 /› ‹Sub ID=ID2 Typ=4000 /› ‹Sub ID=ID3 Typ=2 /› ‹/Pty› ‹Pty ID =ID2 Src=1 R=2› ‹Sub ID=ID4 Typ=79228162514264337593543950335 /› ‹Sub ID=ID5 Typ=3 /› ‹Sub ID=ID6 Typ=4001 /› ‹/Pty› - person Sreeman   schedule 16.08.2012