Как я устанавливаю elementFormDefault Элемента в JAXB на основе единого класса вместо того, чтобы установить его для всего пакета?

Я знаю, что мог использовать @XmlSchema, чтобы сделать это, но проблема, у нас есть класс в том же самом пакете, который нуждается в его пространстве имен, чтобы отличаться от того, что определяется на пакете-info.java. Таким образом, мы объявили пространство имен в @XmlRootElement вместо этого (конечно, все еще имея в распоряжении @XmlSchema). Но выполнение этого не позволит нам устанавливать elementFormDefault класса. Перемещение класса к различному пакету не является выбором. В основном я просто хочу отвергнуть пространство имен для этого конкретного класса.

3
nl ja de

1 ответы

TL; DR

Когда elementFormDefault=XmlNsForm. КВАЛИФИЦИРОВАННЫЙ установлен на @XmlSchema , можно отвергнуть тогда пространство имен для свойств класса, аннотировав его @XmlType (пространство имен = "ANOTHER_NAMESPACE") . Если вы хотите отвергнуть пространство имен для элемента корня, можно сделать @XmlRootElement (пространство имен = "DIFFERENT_NAMESPACE) .

For More Information


МОДЕЛЬ JAVA

Bar

Просто необходимо установить пространство имен на @XmlType аннотация для Бар класс.

package forum14579814;

import javax.xml.bind.annotation.XmlType;

@XmlType(namespace="FOO")
public class Bar {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

package-info

Это отвергнет пространство имен, которое вы определили на уровне пакета @XmlSchema аннотация.

@XmlSchema(namespace="FOO2", elementFormDefault=XmlNsForm.QUALIFIED)
package forum14579814;

import javax.xml.bind.annotation.*;

Foo

Этот объект - корень вашей модели предметной области.

package forum14579814;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    private Bar bar;

    public Bar getBar() {
        return bar;
    }

    public void setBar(Bar bar) {
        this.bar = bar;
    }

}

XML-СХЕМЫ

Ниже XML-схемы, через которые вы обеспечили http://jsfiddle.net/supertonsky/Phck5/.

Foo.xsd

<?xml version="1.0" encoding="UTF-8"?>

    
    
    
        
            
        
    

Bar.xsd

<?xml version="1.0" encoding="UTF-8"?>

    
        
            
        
    

ДЕМОНСТРАЦИОННЫЙ КОДЕКС

Следующий демонстрационный код создаст случай объекта области и произведет его к XML. Продукция xml будет утверждена во время операции маршала против XML-схем, которые вы предоставили.

package forum14579814;

import java.io.File;

import javax.xml.XMLConstants;
import javax.xml.bind.*;
import javax.xml.validation.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Bar bar = new Bar();
        bar.setName("BAR");

        Foo foo = new Foo();
        foo.setBar(bar);

        SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = schemaFactory.newSchema(new File("src/forum14579814/Foo.xsd"));

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

}

Продукция

Тогда вы получили бы следующую продукцию. Отметьте, как имя элемент, который соответствует имени собственность на Бар , квалифицирован с FOO пространство имен, в то время как все другие элементы квалифицированы с FOO2 пространство имен.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

    
        BAR
    

5
добавлено
Вы почти поражаете его. Простите мне, если я иногда сосу при задавании правильного вопроса. На самом деле моя проблема, как в вашем примере, я хочу, чтобы класс Бар остался КВАЛИФИЦИРОВАННЫЙ (как проинструктировано в пакет-info.java ), даже если я установил его пространство имен через @XmlType или @XmlRootElement . Смотря на данный XML, класс Бар , кажется, находится в , ДИСКВАЛИФИЦИРОВАННОМ форма, даже если пакет-info.java установил его КВАЛИФИЦИРОВАННЫЙ (пожалуйста, исправьте меня если I' m неправильно).
добавлено автор supertonsky, источник
Я пытался изменить Фу ' s пространство имен к FOO2 использующий @XmlRootElement и удаленное объявление пространства имен из Бара. То, что произошло, было Фу, стал неправомочным. I' m получение <�бар> <�имя> БАР </ имя> </ бар> </ ns2:foo> , который больше не находится в компетентной форме. Таким образом, когда я утверждаю его против схемы, которая квалифицирована, это терпит неудачу.
добавлено автор supertonsky, источник
Спасибо Блез, но я действительно верю it' s дисквалифицированный. Я создал схему для этого, и произведенная xml подводит проверку против схемы. Here' s связь: jsfiddle.net/supertonsky/Phck5
добавлено автор supertonsky, источник
Извините за эту стычку Блез я должен был сделать вопрос в подробной форме. Я просто пытался сделать вопрос коротким. По-видимому, это работает только на Бар . Теперь от вашего примера, попытайтесь удалить Bar' s @XmlRootElement пространство имен признак и набор Foo' s @XmlRootElement пространство имен к FOO2 и @XmlSchema ' s пространство имен к FOO. Это воспроизведет проблему. То, что я хотел, было, я должен быть в состоянии измениться Фу ' s пространство имен that' s отличающийся от what' s объявленный в @XmlSchema , оставаясь в компетентной форме, как объявлено в @XmlSchema .
добавлено автор supertonsky, источник
Я обновил связь (jsfiddle.net/supertonsky/Phck5) чтобы отразить изменения, я хочу в коде.
добавлено автор supertonsky, источник
Но that' s проблема, я wan' t, чтобы быть в состоянии изменить пространство имен класса Фу к чему-то другому от пакета, оставаясь в компетентной форме, как объявлено в пакете.
добавлено автор supertonsky, источник
Я обновил связь (jsfiddle.net/supertonsky/Phck5) включать @XmlType . Я can' t удаляют @XmlRootElement из Фу . Теперь I' m получение следующей ошибки не Может решить имя ' tns2:Bar' к (n) ' напечатайте definition' компонент. я включал произведенную продукцию xml на связи. У меня нет проблемы при выстраивании его, но невыстраивание его назад от xml против схемы не работает.
добавлено автор supertonsky, источник
@supertonsky - Бар является квалифицированным пространством имен. В том докторе в качестве примера это просто, оказывается, соответствует пространству имен по умолчанию.
добавлено автор Blaise Doughan, источник
@supertonsky - Фу все еще квалифицирован. foo элемент квалифицирован с пространством имен FOO2 и элементы бар и , имя квалифицировано с FOO пространство имен. Элементы с префиксом соответствуют пространству имен по умолчанию ( xmlns = FOO"').
добавлено автор Blaise Doughan, источник
@supertonsky - Спасибо за предоставление схем. Файл Foo.xml, который вы обеспечиваете, не действителен против схем, которые вы предоставили. Я обновил свой ответ (включая проверку), ступают, чтобы показать, что отображения правильны.
добавлено автор Blaise Doughan, источник
Если я изменяю пространство имен на @XmlSchema , чтобы FOO и удалить пространство имен от @XmlType аннотация на Бар . Тогда я должен аннотировать Фу с оба @XmlRootElement (пространство имен = "FOO2") и @XmlType (пространство имен = "FOO2") .
добавлено автор Blaise Doughan, источник
@supertonsky - Это сделано с @XmlType аннотация. Вот другой пример: stackoverflow.com/questions/14651918/…
добавлено автор Blaise Doughan, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async