2011-01-04 9 views
3

Tomcat6でホストされ、JAXB2を使用して結果をマーシャリングする単純なSpring3、Hibernate3 /(JPA2)、RESTfulサービスを構築しました。 (注釈付きのpojosを使用しています)特定の名前空間接頭辞を使用する必要があったので、カスタムcom.sun.xml.bind.marshaller.NamespacePrefixMapperを書きました。私はJAXB2 RIジャーを私のアプリケーションに組み込み、すべてうまく動作しました。Spring3、JAXB2、Java6、NamespacePrefixMapperの質問

誰かがそれが素晴らしいと言ったので、WebLogic 11g(10.3.3)でもそれをホストする必要があります。問題はありません。私は、アプリケーションjarを優先する特別なweblogicデプロイメント記述子を作成し、persistence.xmlの名前を変更し、WARをEARにJPA2 jarファイルでラップしました。それは素晴らしい、ほとんど仕事。

残念ながら、WebLogic ServerはJAXBも使用するカスタムセキュリティレルムを実行し、アプリケーションと競合します。だから私はJAXB jarをアプリケーションから落とし、WebLogicでうまく動作します。もちろん、TomcatにJAXB jarファイルを追加しない限り、Tomcatでは動作しません。私はそれを避けたいです。

私の質問...あなたのアプリケーションでRIをパッケージ化するのと比べて、太陽の "内部" JAXB2実装の使用に関する多くの意見や不一致を含むstackoverflowのかなりの記事を読んだことがあります。この問題にはまだ清潔な解決策はありませんか?私のスタックは、JAXB2 RIを含めずに自分のネームスペースプレフィックスをカスタムマップする別の方法をサポートしていますか? Java6の「内部」JAXB NamespacePrefixMapperを安全に使用できますか、それともJavaのさまざまなリリースで使用できますか? Spring3は別のソリューションを提供していますか? Java6 JAXB2実装の真実はどうですか? Sunの(Oracleの)内部使用のためだけに存在するのでしょうか?

ありがとうございました。

+0

JAXB 2.1は、JDK 6更新4.以来、JDK 6に含まれていますを行いますあなたのアプリケーションにJAXB2 RI jarを追加する必要がありますか? –

+0

@Chin:RIを使うときは、 'NamespacePrefixMapper'のように、それに付属の' com.sun.xml'クラスを安全に使うこともできます。組み込みJava6 JAXBを使用する場合は、 'com.sun.xml.internal'パッケージを使用する必要があります。これは非常にお勧めできません。 – skaffman

+0

@ジョン:可能な解決策については、この質問に対する受け入れられた答えを参照してください。http:// stackoverflow。com/questions/1982977 /カスタマイズ可能な-namespace-prefix-that-jaxb-uses-marshalling – skaffman

答えて

0

コメントに記載されているとおり、私はhttp://www.func.nl/community/knowledgebase/customize-namespace-prefix-when-marshalling-jaxbに記載されているものを要約します。

注:私はこれを試していないので、動作しない可能性があります。

マーシャリング時にXMLStreamWriterを使用するようにJAXBマーシャーを設定し、プレースメントをマップするように設定します。

XMLStreamWriter xmlStreamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(writer); 
xmlStreamWriter.setPrefix("func", "http://www.func.nl"); 

JAXBContext context = JAXBContext.newInstance(object.getClass()); 
Marshaller marshaller = context.createMarshaller(); 

marshaller.marshal(object, xmlStreamWriter); 

アイデアは、JAXBは、プレフィックスマッパーを与えられていない場合、それはプレフィックスを処理するためにXMLStreamWriterにそれを残しておきますと、上記の操作を実行して、あなたはどのようにそれを言っているということですそれをやる。

もう一度:あなたのネットワークから遮断されているウェブサイトのコンテンツを繰り返しているだけなので、私はそれが正しいとは信じられません。

+1

ありがとうskaffman。私はXMLStreamWriterを試していませんでした。 "return myPojo;"よりもはるかに多くのコードが必要ですが、JAXB2 RIや "internal"パッケージを使用することを避ければ、少なくともTomcatとWebLogicの両方で同じアプリケーションを実行できます。私はまだ私の質問に対する答えを知りたいです。 – John

+0

私はこのソリューションを試しましたが、マーシャラーがオープニング文書要素に名前空間と接頭辞を定義するのを妨げるため、いくつかの問題が発生しました。だから友人にリンクを開いてポスト全体の内容を電子メールで送りますが、この解決策でもカスタムマーシャラーのロールアップが必要です。 (私の友人はまだコードを私に送っていませんでした)私は実際にこれがクリエイターが気にしていたものではないと思います。しかし、あなたの努力にとても感謝します。 – John

+0

"Sun"やSpringSourceの誰もがこのフォーラムに参加していますか?これは顕著な問題です。これまでのところ、私は回避策のハックのコレクションがありますが、適切な解決策はありません。おそらく、私のアプリケーションにJAXB2 RIを組み込むことはできますが、WebLogicのセキュリティ領域と何らかの形で衝突することはありません。 – John