2009-10-09 9 views
5

のためのキャメルケースは、私が直接整列化、ジャージーを使用してアンマーシャルしているJAXB豆の数を持っています。JAXBコレクション(リスト<T>)使用パスカルケースの代わりに、要素名

など。

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Artifact", propOrder = { 
    "artifactId", 
    "artifactType", 
    "contentHash" 
}) 
@XmlSeeAlso({ 
    EmailArtifact.class, 
    ManagedDocArtifact.class 
}) 
@XmlRootElement(name ="Artifact") 
public class Artifact { 

    protected String artifactId; 
    protected String artifactType; 
    protected String contentHash; 

... 
... 
... 

} 

単一のアーティファクトオブジェクトを返すGETメソッドを作成するとします。それは、正しくXMLを生成します。

<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 

ここで私が正常に先頭に大文字の「A」を持っているアーティファクト要素の名前を制御することができました。あなたは、コレクションのために、外側の要素が小文字の「A」を持って見ることができるように

<artifacts> 
<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 
<Artifact> 
<artifactId>293289392839283</artifactId> 
<artifactType>EMAIL</artifactType> 
<contentHash>2837873827322</contentHash> 
</Artifact> 
</artifacts> 

はしかし、私はアーティファクトオブジェクトのコレクションを返すGETメソッドを作成し、私はで終わります。私たち自身の内部標準に準拠するためには、これを資本 "A" - アーティファクトにしたいと思います。これはJAXB内で定義することが可能であるところ、私は見ることができない

、それは実際にこれを制御しているジャージーフレームワークとは?

は、我々は、コレクションのために生成された要素名で制御することはできますか?

多くのおかげで、

ジェームズ

+1

1.私の知る限りJAXBは、次のようなマーシャルにコレクション(例えば 'ArrayListのを')あなたを許可していません。しかし、コレクションとしてプロパティを持つオブジェクトを直列化することができます。 2。私はジャージーに慣れていませんが、各アーティファクトを別々にシリアライズするJAXBと、チャンクの全ドキュメントを構築する他のレイヤー(ジャージー)か、またはコレクションのXMLをプロジェクトするJAXBかどうかを知る必要があります。 3.コードを投稿する(またはどこかに公開する)ことができますか - 呼び出す方法は?私は単純なJAXBで試していましたが、これはあなたの設定を模倣しません。 –

+1

私はあなたが正しいと思っています.Jerseyです。これは、JAXB Beanのコレクションをマーシャリング/アンマーシャルすることを可能にしています(私はJerseyユーザーグループと同様にこれを作成しました)。したがって、コレクションのXML要素名の背後にある名前やルールを設定できるような設定がいくつかあることを期待しています...私たちは待っています。あなたが指摘しているように、回避策は、新しいJAXB beanを作成することです。例えば、 "Artifacts"と言うと、1つのコレクションメンバーがあります。リスト人工物 - これは私が感じることは、多くの価値を追加しないクラスの全体の束を紹介します。手伝ってくれてありがとう。 James – jallch

答えて

9

name属性をサポートする@XmlElementWrapperを使用してみてください:

@XmlElementWrapper(name="ELEMENTS") 
@XmlElement(name="ELEMENT") 
protected final List<String> elements = new LinkedList<String>(); 

<ELEMENTS> 
    <ELEMENT>one</ELEMENT> 
    <ELEMENT>two</ELEMENT> 
    ... 
</ELEMENTS> 

を演出します。この機能のためにJAXB Tutorialを参照してください。

+1

こんにちは、残念ながら私はXmlElementWrapperを認識していますが、私のユースケースには当てはまりません。 Jerseyでは、JAXB Beanのコレクションを作成して使用することができます。例えば publicリスト getMyBeans XmlElementWrapperを使用してMyBeanクラスに注釈を付けることはできません。この注釈は、クラスのプロパティに対してのみ使用できます。クラス内のコレクションだからこれは良いことではありません。コレクションを含む新しいクラスを使用できるという点では解決策がありますが、実際には必要ないクラスをクラス内に作成することは正直なところです。 – jallch

+0

XMLについての良いことは、1000通りに変換できることです; ** XSLT **または** DOM **を使用できます。 –

+0

ありがとうございます、あなたのソリューションはリストのシリアライズに関する別の問題を解決しました。 – Pragmateek

5

OK - ポール・サンド - 私はJavaのジャージーコミュニティのリーダーからのアップデートがありました。これは、現在ジャージーフレームワークと、我々はそれが将来のアップデートで修正されるまでの回避策または受け入れる必要がありますだけで何かで開いて問題です。

上記のコメントの1つで説明した回避策は、JAXB注釈付きBeanのコレクション(例:List)を返すWebサービスメソッドごとに新しいクラスを導入することです。このクラスは事実上、ただ1つのメンバー、つまりJAXB Beanのリストを含むクラスです。 WebサービスメソッドでListを返す代わりに、代わりに特別なクラスを返します。 XML内の新しいクラスの名前を制御できるためです。 @XmlRootElement(名前=「アーティファクト」)我々は短期的に問題を回避することができます。

これが役に立ちます。

よろしく、

ジェームズ

+0

現在のJerseyリリース(1.11)に解決策があるかどうか知っていますか? または、ジャージーのディスカッションへのポインタ/機能に関する問題? – Yaegor

関連する問題