12

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 : NamespacePrefixMapper

次のクラスを作成し、マッパーをマーシャラーに設定しました。

// 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では例外がスローされます。

pom に maven の依存関係も追加しましたが、JRE バージョンの方が優先度が高いようです。

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

これについて私を助けてもらえますか?

PS : ビルド上の理由から、jar をクラスパスに直接含めることはできません。PS2 : JDK7 を使用できません。前もって感謝します。

4

2 に答える 2

0

今日も同じ問題がありました。実稼働マシンには Java 6 があり、アプリケーションをデプロイしたときに ns2 プレフィックスを取得していました。これが私がそれを解決した方法です。実動サーバーには Java 1.6 パッチ 21 しかありません

  1. すべてのクラスが Jaxb を使用して生成されたパッケージに package-info.java ファイルがあることを確認しました。私はそれをチェックし、 @XmlSchema はすべて自動生成されたので、それを台無しにしませんでした。名前空間マッパーを使用しないでください。混乱しました。

  2. pom.xml ファイルに、jaxb-impl 依存関係を追加しました: com.sun.xml.bind jaxb-impl 2.2.5-b04

    ソースとターゲットを 1.6 と指定しました。Maven のクリーン インストールとパッケージ化を実行し、本番環境にデプロイしたところ、すべて問題ないようです。次のステップは、実稼働マシンが Java 7 にアップグレードされていることを確認することです。これがお役に立てば幸いです :)

于 2015-03-12T23:04:52.773 に答える