4

文字列のマップをマーシャリングするために作成したカスタム XML アダプターに、XmlType を持つ POJO オブジェクトを使用しています。ただし、null 値を適切に使用できるようにするのに問題があります。動作させることはできましたが、生成される XML には満足できません。

これは私が現在使用しているものであり、作業したいと考えていますが、サンプルの XML 結果でわかるように、適切な xmlns:xsi="http://www.w3.org/2001/XMLSchema が含まれていません。 -instance" xsi:nil="true" 値

@XmlType(name="element")
public class RestMapElements {

  @XmlAttribute(name="name")
  public String key;
  @XmlValue
  public String value;

  public RestMapElements(String key, String value) {
    this.key = key;
    this.value = value;
  }
}

結果の XML (関連データにスリム化)。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
...
    <element-list>
        <item name="activated_date">2012-03-29 11:34:14.323</item>
        <item name="some_null_value"/>
    </element-list>
...

ただし、これで動作させることができました。動作させるためにアイテムタグ内に追加の「値」タグを追加する必要がある XML に満足していません。(補足として、XmlType の名前宣言で指定しようとしたのと同じように、要素ではなく項目に名前を付けるのはなぜですか?)

@XmlType(name="element")
public class RestMapElements {

  @XmlAttribute(name="name")
  public String key;
  @XmlElement(nillable = true)
  public String value;

  public RestMapElements(String key, String value) {
    this.key = key;
    this.value = value;
  }
}

再び、結果の XML (関連データにスリム化)。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
...
<element-list>
    <item name="activated_date"><value>2012-03-29 11:34:14.323</value></item>
    <item name="some_null_value"><value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/></item>
</element-list>
...

本当に、問題を解決するために2番目を使用できます。これを学習体験として使用して、null 値をサポートできるように、項目タグの下に追加の値タグを追加することなく、アノテーションを使用する JAXB がこれを探しているものに曲げることができるかどうかを確認したいだけです。 . 現在、最初の例でアンマーシャリングすると、null ではなく空の文字列が返されます。2 番目の例では、予期していた null 値を取得しています。

参考までに: 現在、Jersey 1.11 を使用しています。

4

2 に答える 2

2

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB 2 (JSR-222)エキスパート グループのメンバーです。

MOXy の@XmlNullPolicy拡張機能を使用して、このユース ケースをマッピングできます。

RestMapElements

package forum10415075;

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.*;

@XmlType(name="element")
public class RestMapElements {

  @XmlAttribute(name="name")
  public String key;

  @XmlValue
  @XmlNullPolicy(nullRepresentationForXml=XmlMarshalNullRepresentation.XSI_NIL)
  public String value;

}

package forum10415075;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    @XmlElementWrapper(name="element-list")
    @XmlElement(name="item")
    public List<RestMapElements> items = new ArrayList<RestMapElements>();

}

jaxb.properties

MOXy を JAXB (JSR-222) プロバイダーとして使用するにはjaxb.properties、ドメイン モデルと同じパッケージで呼び出されるファイルを次の内容で追加する必要があります。

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory

デモ

package forum10415075;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum10415075/input.xml");
        Root root = (Root) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

input.xml/出力

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <element-list>
      <item name="activated_date">2012-03-29 11:34:14.323</item>
      <item name="some_null_value" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
   </element-list>
</root>

ノート

GlassFish 3.1.2 MOXy または WebLogic 12.1.1 で Jersey を使用している場合は、すでに含まれています。

于 2012-05-02T15:00:26.397 に答える
0

私はあなたの問題を見ます。のitem要素は、あなたの(または何でも)の対応するエントリを に設定し、属性を失うxsi:nil="true"ことによってのみ生成されます。解決策はあまりないと思います。RestMapElementsArrayListnull

1つのオプションは、投稿の最初からマーシャリングを使用し、次を使用してマーシャリングを解除することです。

このようなことをしている場合:

@XmlElementWrapper(name="element-list")
@XmlElement(name="item")
public ArrayList<RestMapElements> list;

a を使用して、が空XmlAdapterかどうかを確認し、次のように設定できます。valueStringnull

@XmlElementWrapper(name="element-list")
@XmlElement(name="item")
@XmlJavaTypeAdapter(ItemAdapter.class)
public ArrayList<RestMapElements> list;

そしてItemAdapter

public class ItemAdapter extends XmlAdapter<RestMapElements, RestMapElements> {

    @Override
    public RestMapElements unmarshal(RestMapElements v) throws Exception {
        if (v.value.equals("")) v.value = null;
        return v;
    }
}

これはまだエレガントではありませんが。適切な要素を生成したい場合xsi:nil="true" item、これは明らかに望んでいるものではありません。

幸運を。

于 2012-05-02T14:37:27.690 に答える