@MaxLich
java developer

Как сделать, чтобы JAXB нормально сериализовал динамически подставляемый вложенный объект?

Здравствуйте. Есть такой элемент в схеме:
spoiler
<xs:element name="CustomAttributes" minOccurs="0">
				<xs:annotation>
					<xs:documentation>Дополнительные атрибуты документа</xs:documentation>
				</xs:annotation>
				<xs:complexType>
					<xs:sequence>
						<xs:any processContents="lax"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>

И есть схемы для элементов, которые могу быть вложены в CustomAttributes:
spoiler
<xs:element name="ServiceProperties">
        <xs:annotation>
            <xs:documentation xml:lang="ru">МЖИ:Лицензирование предпринимательской деятельност</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:all>
                <xs:element name="adress_house" minOccurs="0" type="xs:string">
                    <xs:annotation>
                        <xs:documentation xml:lang="ru">Адрес дома</xs:documentation>
                    </xs:annotation>
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

Сгнерировались такие классы:
spoiler
@XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "CustomAttributes", propOrder = {
        "any"
    })
    public static class CustomAttributes {

        @XmlAnyElement(lax = true)
        protected Object any;

        /**
         * Gets the value of the any property.
         * 
         * @return
         *     possible object is
         *     {@link Element }
         *     {@link Object }
         *     
         */
        public Object getAny() {
            return any;
        }

        /**
         * Sets the value of the any property.
         * 
         * @param value
         *     allowed object is
         *     {@link Element }
         *     {@link Object }
         *     
         */
        public void setAny(Object value) {
            this.any = value;
        }

    }
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {

})
@XmlRootElement(name = "ServiceProperties")
public class ServiceProperties {

    @XmlElement(name = "adress_house")
    protected String adressHouse;

    /**
     * Gets the value of the adressHouse property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getAdressHouse() {
        return adressHouse;
    }

    /**
     * Sets the value of the adressHouse property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setAdressHouse(String value) {
        this.adressHouse = value;
    }
}

Нужно, чтобы получился xml вида:
<CustomAttributes>
                <ServiceProperties>
                    <adressHouse >123</adressHouse >
                </ServiceProperties>
            </CustomAttributes>


Мой код:
ServiceProperties serviceProperties = new ServiceProperties();
             serviceProperties.setAdressHouse("123");
            customAttributes.setAny(serviceProperties );

Не работает. Он просто вызываетtoString() у этого объекта (serviceProperties).

Пробовал через JAXBElement, но тоже не помогает. Есть какое-то нормальное решение?

(Пока идея только отдельно сериализовать serviceProperties, а потом кидать его в метод setAny(); но это какое-то костыльное решение)
  • Вопрос задан
  • 257 просмотров
Решения вопроса 1
@MaxLich Автор вопроса
java developer
Всё работает. Оказалось, что надо было при создании контекста прописать пакет, в котором лежит ServiceProperties:
jaxbContext = JAXBContext.newInstance(PACKAGE_WITH_JAXB_OBJECTS + ":" + PACKAGE_WITH_JAXB_OBJECTS_2);

Также, чтобы не было проблем с пространствами имён, перенёс в этот пакет файл package-info.java с основного пакета. Файл имеет такое содержимое:
@javax.xml.bind.annotation.XmlSchema(namespace = "http://firma.ru/schema/v6_1/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package ru.my-firm.app.my-project.jaxbobjects;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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