web-dev-qa-db-ja.com

JDK6u18でのJAXBのNamespacePrefixMapperの変更点

私のプロジェクトではcom.Sun.xml.bind.marshaller.NamespacePrefixMapperを使用していますが、JDK 6u17では問題ありませんでした。今、私は6u18に更新しましたが、com.Sun.xml.internal.bind.marshaller.NamespacePrefixMapperに置き換えられたことがわかりました。ただし、このクラスをインポートして自分のクラスをコンパイルしようとすると、エラーが発生します。

パッケージcom.Sun.xml.internal.bind.marshallerは存在しません
 import com.Sun.xml.internal.bind.marshaller.NamespacePrefixMapper; 

NetBeansのコード補完機能を使用してこのパッケージにアクセスできますが、NetBeansはエラーのコードを強調表示しません。

何か助けていただければ幸いです!

26
Daniel Szalay

私はクラスcom.Sun.xml.internal.bind.marshaller.NamespacePrefixMappercom.Sun.xml.bind.marshaller.NamespacePrefixMapperの置き換えであるとは思いません。前者は長い間存在しますあなたが使用することを意味しませんAT ALL(したがって、internalパッケージング)。

ここでの問題は、JavaSE 6にはJAXB RIがない(JAXB実装はあるがJAXB RIはない)ため、RI固有の機能に依存したい場合は、アプリケーションにJAXB RIをバンドルする必要があります(これにより保護されます) Java SEでのJAXBの変更から)。

18
Pascal Thivent

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.;

これは、JDK7にバンドルされているJAXBで機能します。他のJDKバージョンでは、JAXBを2.2.4に更新します。

16
Daniel De León

com.Sun.**クラスを直接使用することは想定されていません。これらは内部用であり、予告なしに変更される場合があります。 (そして何が起こったのか見てください!!)新しいクラスがパッケージ名にinternalを持っているという事実はさらに大きなヒントです!

com.Sun.**クラスを使用しない、より良い方法を探すことを強くお勧めします。

[〜#〜] edit [〜#〜]-うーん、JAXB RIの責任者の誰もが、その拡張機能のパッケージ名に関するSunの規則に違反しているようです!また、Sunがこの特定のRI拡張機能をJDK 6.0に実装していないことも残念です。

4
Stephen C

この場合、Sunはまったく適切でないものを作成しました。名前空間マッパーは仕様に含まれていませんが、プレフィックスをカスタマイズする方法として「宣伝」されています。したがって、一般的なアドバイスは「com.Sun.* "はここでは適用されず、このクラスの javadoc は次のように述べています。

ユーザーアプリケーションによって実装され、URI->プレフィックスマッピングを決定します。

この記事を確認してください で、うまくいくかどうかを確認してください。

4
Bozho

スタックオーバーフローでの以下の投稿は質問に答えます: NamespacePrefixMapperを使用せずにSpring JAXB名前空間を定義する

重要なのは、ビルド時にrt.jarを含め、コンパイル後にそれをアプリケーションから削除することです。

1
Mr. Doomsbuster

Mavenを使用している場合は、このリンクを介してJAXB-RIとJAXB for Java6の両方が機能することがわかりました。

http://mvnrepository.com/artifact/com.googlecode.jaxb-namespaceprefixmapper-interfaces/JAXBNamespacePrefixMapper/2.2.4

1
Steve

最近、いくつかの古いコードを新しいプロジェクトに移植するときにこれに遭遇しました。古いプロジェクトはantを使用して問題なくコンパイルされましたが、新しいプロジェクトは上記のエラーで失敗しました。

少し調べたところ、古いbuild.xmlファイルはjavacコンパイラオプションを使用して上記の制限を回避していることがわかりました。

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

それを見つけた後、私はこの他のstackoverflow質問を検索して見つけました: javacでの内部Sunクラスの使用

1
Travis