Подтвердить что ты не робот

Что произошло с JAXB NamespacePrefixMapper в JDK6u18

Я использовал com.sun.xml.bind.marshaller.NamespacePrefixMapper в своем проекте, и у меня не было проблем с ним в JDK 6u17. Теперь я просто обновился до 6u18, и увидел, что он был заменен на com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper. Однако, если я импортирую этот класс и попытаюсь скомпилировать мои классы, я получаю сообщение об ошибке:

package com.sun.xml.internal.bind.marshaller does not exist
import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;

Я могу получить доступ к этому пакету через функцию завершения кода NetBeans, а NetBeans не выделяет код для ошибок.

Любая помощь будет оценена!

4b9b3361

Ответ 1

Я не думаю, что класс com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper является заменой com.sun.xml.bind.marshaller.NamespacePrefixMapper, первый из них существует в течение длительного времени, и он НЕ МОЖЕТ БЫТЬ ИСПОЛЬЗОВАН ВАМИ НА ВСЕХ (отсюда упаковка internal).

Проблема здесь в том, что JavaSE 6 не имеет JAXB RI (у него есть реализация JAXB, но не JAXB RI), поэтому, если вы хотите полагаться на специфичную для RI функцию, вы должны связать JAXB RI в своем приложении (и что защитит вас от изменений JAXB в Java SE).

Ответ 2

NamespacePrefixMapper больше не используется.

Используйте аннотации в package-info.java:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://nameSpaceUri"
, xmlns = {
    @XmlNs(prefix = "myPrefix", namespaceURI = "http://nameSpaceUri")
}
, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

package my.package.;

Это работает с JAXB в комплекте с JDK7, для другого обновления JDK версии JAXB до версии 2.2.4.

Ответ 3

Вы не должны использовать классы com.sun.** напрямую. Они считаются внутренними и могут быть изменены без предварительного уведомления. (И посмотрите, что только что произошло!) Тот факт, что новый класс имеет internal в названии пакета, является еще большим намеком!

Я настоятельно рекомендую вам искать лучший способ делать то, что вы делаете..., который не использует классы com.sun.**.

EDIT - хммм, похоже, что тот, кто несет ответственность за JAXB RI, нарушил правила Sun о именах пакетов для этого расширения! К сожалению, Sun не реализовал это расширение RI в JDK 6.0.

Ответ 4

В этом случае Солнце сделало что-то не совсем подходящее. Преобразователь пространства имен не включен в спецификацию, но он "рекламируется" как способ настройки префиксов. Поэтому общий совет "не использовать com.sun.*" здесь не применяется, а javadoc этого класса говорит:

Реализовано пользовательским приложением для определения отображения URI → префиксов.

Проверьте эту статью и посмотрите, будет ли это работать для вас.

Ответ 5

Я столкнулся с этим недавно, когда переносил старый код в новый проект. Старый проект скомпилирован с использованием ant, но новый с ошибкой вы упомянули выше.

После некоторого копания я обнаружил, что старый файл build.xml использует параметр компилятора javac для обхода ограничения выше:

<javac srcdir="${srcDir}" destdir="${outputDir}" classpathref="classpath" debug="on">
    <compilerarg value="-XDignore.symbol.file" />
</javac>

После поиска, я искал и нашел этот другой вопрос stackoverflow: Использование внутренних классов солнца с помощью javac