5

Jersey を使用して直接マーシャリングおよびアンマーシャリングされた JAXB Bean が多数あります。

例えば

@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>

ここで、Artifact 要素の名前の先頭に大文字の「A」を付けることができました。

ただし、成果物オブジェクトのコレクションを返す GET メソッドを作成すると、次のようになります。

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

ご覧のとおり、コレクションの外側の要素には小文字の「A」があります。私たち自身の内部基準に準拠するために、これを大文字の「A」にしたいと思います - Artifacts.

JAXB 内でこれを定義できる場所がわかりません。実際にこれを制御しているのはジャージー フレームワークですか?

コレクション用に生成された要素名を制御できますか?

どうもありがとう、

ジェームズ

4

2 に答える 2

9

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

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

生産します

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

この機能については、 JAXB チュートリアルを参照してください。

于 2009-10-09T21:51:51.520 に答える
5

OK-JavaジャージーのコミュニティリーダーであるPaulSandozから最新情報を受け取りました。これは現在、Jerseyフレームワークの未解決の問題であり、将来のアップデートで修正されるまで回避または受け入れる必要があります。

上記のコメントの1つで説明されている回避策は、JAXB注釈付きBeanのコレクション(リストなど)を返すWebサービスメソッドごとに新しいクラスを導入することです。このクラスは、事実上、1つのメンバー(JAXB Beanのリスト)のみを含むクラスです。WebサービスメソッドでListを返す代わりに、代わりに特別なクラスを返します。XML内の新しいクラスの名前(@XmlRootElement(name = "Artifacts")など)を制御できるため、短期的に問題を回避できます。

お役に立てれば。

よろしく、

ジェームズ

于 2009-10-13T08:59:42.740 に答える