JAXB @XmlSeeAlso getValue [дублировать]

Как описано в post Retrofit 2 - Dynamic URL , нотация @Url предполагает, что String является полностью определенным URL-адресом и не проверяет, содержит ли он @Path переменные.

Чтобы использовать аннотацию @Path, вам необходимо настроить URL-адрес конечной точки и включить переменную @Path внутри аннотации @GET().

4
задан Marcus Junius Brutus 3 June 2013 в 19:42
поделиться

1 ответ

Реализация JAXB (JSR-222) позаботится обо всем для вас. JAXB считает, что каждый класс соответствует сложному типу. У него есть алгоритм для определения имени типа, но вы можете переопределить его, используя аннотацию @XmlType. Когда элемент неармаллирован, если он содержит атрибут xsi:type, тогда JAXB будет смотреть, есть ли класс, связанный с этим типом. Если это будет, он будет создавать экземпляр класса этого типа, если он не будет создавать экземпляр типа, соответствующего этому элементу, на основе метаданных сопоставления, предоставленных через аннотации.

Для получения дополнительной информации


UPDATE

Ниже приведен пример, который может помочь:

schema.xsd

В схеме XML ниже сложный тип canadianAddress расширяет complexType address.

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/customer" 
    xmlns:tns="http://www.example.org/customer" 
    elementFormDefault="qualified">

    <element name="customer">
        <complexType>
            <sequence>
                <element name="address" type="tns:address"/>
            </sequence>
        </complexType>
    </element>

    <complexType name="address">
        <sequence>
            <element name="street" type="string"/>
        </sequence>
    </complexType>

    <complexType name="canadianAddress">
        <complexContent>
            <extension base="tns:address">
                <sequence>
                    <element name="postalCode" type="string"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>

</schema>

Демо

В демонстрационном коде ниже XML будет преобразован в модель JAXB, сгенерированную из приведенной выше схемы XML, а затем преобразован обратно в XML.

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance("org.example.customer");

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/org/example/customer/input.xml");
        Customer customer = (Customer) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(customer, System.out);
    }

}

input.xml / Output

Ниже приведен XML. Элемент address имеет квалификацию xsi:type, чтобы указать, что он содержит экземпляр canadianAddress вместо только address.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer xmlns="http://www.example.org/customer">
    <address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="canadianAddress">
        <street>1 A Street</street>
        <postalCode>Ontario</postalCode>
    </address>
</customer>
3
ответ дан Blaise Doughan 17 August 2018 в 14:38
поделиться
  • 1
    На самом деле я проверил вашу статью в блоге перед публикацией здесь, но, похоже, он сфокусирован в направлении Java на XML. Итак, в принципе, xsi: type не выдерживает разборки? – Marcus Junius Brutus 3 June 2013 в 20:22
  • 2
    @MarcusJuniusBrutus - Это определенно. Существует ли класс, соответствующий значению атрибута xsi: type? – Blaise Doughan 3 June 2013 в 20:25
  • 3
    да, есть соответствующий класс. Я просто предполагаю, что если такой класс недоступен в JAXBContext, JAXB, скорее всего, создаст суперкласс, и в этом случае у нас будет какая-то «потеря информации». Но я не пытался воспроизвести эту последнюю гипотетическую ситуацию. – Marcus Junius Brutus 3 June 2013 в 20:38
  • 4
    @MarcusJuniusBrutus - Используете ли вы имя пакета при создании JAXBContext (т. Е. JAXBContext.newInstance("com.example.foo"); – Blaise Doughan 3 June 2013 в 20:40
  • 5
    В этом конкретном случае да, список имен пакетов, разделенных двоеточиями. В других случаях я использовал объекты-объекты или даже полное и подробное перечисление всех классов (когда я ударил эту проблему: java.net/jira/browse/JAXB-962 ) – Marcus Junius Brutus 3 June 2013 в 20:55
Другие вопросы по тегам:

Похожие вопросы: