13

最新のJAX-RSはjava.util.ListをXMLRootElementとして返すメソッドを処理できるようですが、通常のJAXBは処理できません。CXFとJerseyが行っていることを模倣したいと思います。

言い換えれば、CXFやJerseyと同じように、リストをマーシャリングしたいと思います。通常、JAXBを使用してリストをマーシャリングしようとすると、ルート要素の例外が発生します。ラッピングオブジェクトを作成せずにこれを回避するにはどうすればよいですか?

編集:多くの回答に感謝しますが、私は@XmlElementWrapperに精通していますが、JAX-RSが実行していることをシミュレートすることすらできません。

JAX-RSはこれを行います:

@XmlRootElement(name="dog")
public class Dog {
    private String name;
    public String getName() { return this.name; }
    //Setter also
}

犬のリストをシリアル化すると、次のようになります。

serialize(List<Dog> dogs);

XMLは(JAX-RSが行うこと)である必要があります:

<dogs>
    <dog><name>Rascal</name></dog>
</dogs>

したがって、すべての単一ドメインオブジェクトに対してラッパーオブジェクトを作成する必要がないことがわかります。

4

7 に答える 7

7

単純に追加できませんか:

@XmlElementWrapper(name = "wrapperName")

ラッパーオブジェクトを作成する必要はありません。これは、マーシャリングされたXML応答のルート要素になります。

于 2011-12-13T16:35:45.550 に答える
3

次のコードを使用してカスタムの反復可能リストを使用しました。これがお役に立てば幸いです。

package bindings;

import java.io.Serializable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlType
@XmlRootElement
public class CustomBindList<V> implements Iterable<V>, Serializable {
        private static final long serialVersionUID = 4449835205581297830L;

        @XmlElementWrapper(name = "List")
        @XmlElement(name = "Entry")
    private final List<V> list = new LinkedList<V>();

    public CustomBindList() {
    }

    public void add(final V obj) {
            list.add(obj);
    }

    public V get(final int index) {
        return list.get(index);
    }

    @Override
    public Iterator<V> iterator() {
        return list.iterator();
    }

    public int size() {
        return list.size();
    }
}
于 2012-01-21T05:49:13.260 に答える
3

私には、JAXBマッピングを完全に台無しにすることを避け、すべてを魔法のように機能させることができる秘密があります。

このアプローチを何年も使用しており、マーシャリング/アンマーシャリングについて心配するのに5分も費やしたことはありません。秘密は....JAXBを使用しないでください。:)

JAX-RSを使用するほとんどのプロジェクトでは、xstreamを使用するようにJerseyを構成し、xstreamにマーシャリング/アンマーシャリングの方法を理解させます。(またはJSONの場合はjackson)

xstream / jacksonのようなものの代わりにJAXBを使用する理由はいくつかあるかもしれませんが、私はまだ何も見つけていません。

于 2012-05-02T20:10:47.653 に答える
1

コレクションに。で注釈を付け@XmlJavaTypeAdapter(value = Adapter.class)ます。AdapterクラスはXmlAdapter<key, value>、キーから(非)マーシャルへの一意の識別子であり、値はドメインオブジェクトです。

多分これはあなたを助けることができます。ただし、ドメインオブジェクトごとにアダプタを作成する必要があります。

于 2012-06-01T11:45:57.537 に答える
1

リストのマッピングは次のように行うことができます。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
public class TestRootObject {

  @XmlElement(name = "testList") 
  private List<TestObj> testList;

  //getter setter
}
于 2012-04-21T05:55:56.130 に答える
1

Jacksonをチェックしてください。JAXBバインディングと非常に互換性があり、MappingJsonFactoryを使用すると、JavaからXML、Java、Json、Javaを互換的に使用できます。

于 2012-05-11T11:56:02.250 に答える
1

Blaise Doughanは、この問題の良い解決策をここに示していると思います。プログラムでJAXBを構成することは可能ですか?

http://blog.bdoughan.com/2012/11/creating-generic-list-wrapper-in-jaxb.html

ユースケースは少し異なりますが、ここでは多少異なります。

http://blog.bdoughan.com/2012/02/xmlanyelement-and-xmladapter.html

于 2015-03-09T17:57:07.557 に答える