Использование JDK JAXB без префикса ns2

После того, как вы прочитали все сообщения об этом на форумах Oracle, Stackoverflow, java.net, я наконец-то разместил здесь. Я использую JAXB для создания XML файлов, но проблема в том, что он добавляет знаменитый префикс ns2 перед моими элементами, я пробовал все решения, которые никто не работал у меня. java -version дает "1.6.0_37"

Решение 1: Использование package.info.java

Я создал файл в моем пакете, содержащий мои аннотированные классы @Xml * со следующим содержимым:

@XmlSchema(
    namespace = "http://mynamespace",
    elementFormDefault = XmlNsForm.QUALIFIED,
    xmlns = {
        @XmlNs(namespaceURI = "http://mynamespace", prefix = "")
    }
)
package com.mypackage;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

Решение 2: пространство именPrefixMapper

Я создал следующий класс и задал mapper для маршаллера:

// Change mapper to avoid ns2 prefix on generated XML
class PreferredMapper extends NamespacePrefixMapper {
    @Override
    public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
        return "";
    }
}
NamespacePrefixMapper mapper = new PreferredMapper();
try {
    marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
}
catch (PropertyException e) {
   logger.info("No property for com.sun.xml.bind.namespacePrefixMapper found : " + e.getMessage());
}

С com.sun.xml.bind.namespacePrefixMapper ничего не происходит, с com.sun.xml.internal.bind.namespacePrefixMapper, он выдает исключение.

Я также добавил зависимость maven в моем pom, но кажется, что версия JRE имеет более высокий приоритет:

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.4</version>
</dependency>

Можете ли вы мне помочь?

PS: Я не могу включить непосредственно jar в свой путь к классам для создания причин. PS2: Я не могу использовать JDK7. Спасибо заранее.

Ответ 1

Без реализации MOXy невозможно. JAXB, если предпочтительным префиксом является "", он генерирует новый.

У меня была такая же проблема в прошлом, и я настроил каждый префикс для каждого package-info.java.

NamespacePrefixMapper говорит в JAVADOC

null if there no prefered prefix for the namespace URI.
In this case, the system will generate a prefix for you.

Otherwise the system will try to use the returned prefix,
but generally there no guarantee if the prefix will be
actually used or not.

return "" to map this namespace URI to the default namespace.
Again, there no guarantee that this preference will be
honored.

If this method returns "" when requirePrefix=true, the return
value will be ignored and the system will generate one"

else, если используется package-info

we know we can't bind to "", but we don't have any possible name at hand.
generate it here to avoid this namespace to be bound to "".

Надеюсь, я дал вам все ответы на ваш вопрос.

Ответ 2

У меня была такая же проблема сегодня. У производственной машины есть Java 6, и когда я развернул свое приложение, я получил префикс ns2. Вот как я это решил. У производственного сервера есть только патч 21 для Java 1.6

  • Я убедился, что у меня есть файл package-info.java в моем пакете, где все классы были созданы с использованием Jaxb. Я проверил его, и @XmlSchema был полностью сгенерирован, поэтому я не смутился ни с одним из них. Не используйте namespacemapper, который меня просто смутил.

  • В моем файле pom.xml я добавил зависимость jaxb-impl: com.sun.xml.bind JAXB-реализ 2.2.5-b04

    а указанный источник и цель - 1.6. Было ли maven чистым, установить и установить в производство, все выглядит хорошо. Следующий шаг - убедиться, что производственная машина обновлена ​​до Java 7. Надеюсь, это поможет:)