JAXBを使用してコレクションのdefaultValueを指定する方法はありますか?

Lukas Eder

私はJavaでこの属性を持っています

@XmlList
@XmlElement(defaultValue = "COMMENTS CASE_INSENSITIVE")
protected List<RegexFlag> regexFlags;

このXSDに由来するXJCから生成されたもの:

<element name="regexFlags" type="tns:RegexFlags" 
    minOccurs="0" maxOccurs="1" default="COMMENTS CASE_INSENSITIVE"/>

<simpleType name="RegexFlags">
  <list itemType="tns:RegexFlag"/>
</simpleType>

<simpleType name="RegexFlag">
  <restriction base="string">
    <enumeration value="UNIX_LINES"/>
    <enumeration value="CASE_INSENSITIVE"/>
    <enumeration value="COMMENTS"/>
    <enumeration value="MULTILINE"/>
    <enumeration value="LITERAL"/>
    <enumeration value="DOTALL"/>
    <enumeration value="UNICODE_CASE"/>
    <enumeration value="CANON_EQ"/>
    <enumeration value="UNICODE_CHARACTER_CLASS"/>
  </restriction>
</simpleType>

残念ながら、これは機能していないようです。デフォルト値は正しくマーシャリングされていません。<regexFlags/>要素がないときに取得する値は、実際には単なる空のリストです。私は何が間違っているのですか?これはJAXBでも可能ですか?

bdoughan

アノテーションdefaultValueプロパティ@XmlElementは、JAXB(JSR-222)実装が空の要素の値と交換する必要があるものです。その要素が@XmlList。で注釈が付けられたプロパティにマップされている場合、それらはリファレンスとこれのMOXy実装のバグのようです。

ドメインモデル

ルート

これは、String3List<String>つと3つのフィールドがすべて@XmlElement(defaultValue="a b c")。で注釈されたサンプルクラスです。List<String>フィールドもで注釈を付けています@XmlList

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

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElement(defaultValue="a b c")
    String singleMissingElement;

    @XmlElement(defaultValue="a b c")
    String singleEmptyElement;

    @XmlElement(defaultValue="a b c")
    String singlePopulatedElement;

    @XmlElement(defaultValue="a b c")
    @XmlList
    List<String> listMissingElement;

    @XmlElement(defaultValue="a b c")
    @XmlList
    List<String> listEmptyElement;

    @XmlElement(defaultValue="a b c")
    @XmlList
    List<String> listPopulatedElement;

}

デモコード

デモ

以下は、一部のXMLをアンマーシャリングし、結果のフィールドをオブジェクトから出力するデモコードです。XML要素は、フィールド名に基づいて入力されます(つまりmissing、XMLに存在しないことを意味し、empty空の要素をpopulated意味し、値を持つ要素を意味します)。

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

public class Demo {

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

        StringReader xml = new StringReader("<root><singleEmptyElement/><singlePopulatedElement>populated</singlePopulatedElement><listEmptyElement/><listPopulatedElement>populated</listPopulatedElement></root>");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Root root = (Root) unmarshaller.unmarshal(xml);

        System.out.println(root.singleMissingElement);
        System.out.println(root.singleEmptyElement);
        System.out.println(root.singlePopulatedElement);

        System.out.println(root.listMissingElement);
        System.out.println(root.listEmptyElement);
        System.out.println(root.listPopulatedElement);
    }

}

出力

予期せず出力される唯一の値は、List<String>フィールドの空の要素に対応する5番目の値です基づいて、defaultValue私それがあることを期待したList文字列が含まれるabc

null
a b c
populated
null
[]
[populated]

なぜこれがdefaultValueオンの動作なの@XmlElementですか?

XMLスキーマ(schema.xsd)

defaultValue上のプロパティ@XmlElement注釈はに対応するdefaultのプロパティelementXMLスキーマで宣言。以下は、Javaモデルで注釈を付けたものと同等のスキーマです。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="root" type="root"/>

  <xs:complexType name="root">
    <xs:sequence>
      <xs:element name="singleMissingElement" type="xs:string" default="a b c" minOccurs="0"/>
      <xs:element name="singleEmptyElement" type="xs:string" default="a b c" minOccurs="0"/>
      <xs:element name="singlePopulatedElement" type="xs:string" default="a b c" minOccurs="0"/>
      <xs:element name="listMissingElement" minOccurs="0" default="a b c">
        <xs:simpleType>
          <xs:list itemType="xs:string"/>
        </xs:simpleType>
      </xs:element>
      <xs:element name="listEmptyElement" minOccurs="0" default="a b c">
        <xs:simpleType>
          <xs:list itemType="xs:string"/>
        </xs:simpleType>
      </xs:element>
      <xs:element name="listPopulatedElement" minOccurs="0" default="a b c">
        <xs:simpleType>
          <xs:list itemType="xs:string"/>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

デモコード

以下は、スキーマ検証を有効にしてSAX解析を実行し、ContentHandler情報をにダンプするコードですSystem.out

import java.io.*;
import javax.xml.XMLConstants;
import javax.xml.parsers.*;
import javax.xml.validation.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;

public class ParseDemo {

    public static void main(String[] args) throws Exception {
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = sf.newSchema(new File("src/forum27528698/schema.xsd")); 

        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setSchema(schema);
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(new MyHandler());

        StringReader xml = new StringReader("<root><singleEmptyElement/><singlePopulatedElement>populated</singlePopulatedElement><listEmptyElement/><listPopulatedElement>populated</listPopulatedElement></root>");
        InputSource input = new InputSource(xml);
        xr.parse(input);
    }

    private static class MyHandler extends DefaultHandler {

        @Override
        public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
            System.out.print("<" + qName + ">");
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            System.out.print(new String(ch, start, length));
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            System.out.println("</" + qName + ">");
        }

    }

}

出力

出力では、デフォルト値が空の要素に適用されているが、存在しない要素には適用されていないことがわかります。

<root>
<singleEmptyElement>a b c</singleEmptyElement>
<singlePopulatedElement>populated</singlePopulatedElement>
<listEmptyElement>a b c</listEmptyElement>
<listPopulatedElement>populated</listPopulatedElement>
</root>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

JAXBを使用してコレクションのdefaultValueを指定する方法はありますか?

分類Dev

Laravelで特定のモデルのコレクションとして引数を指定する方法はありますか?

分類Dev

Guavaを使用してコレクションを変換するときにnullを削除するエレガントな方法はありますか?

分類Dev

セキュリティルールを使用してCloud Firestoreコレクションのサイズを確認する方法はありますか?

分類Dev

Rustのスタックでコレクションを使用する方法はありますか?

分類Dev

linqを使用してコレクションから特定のコレクションを取得する方法は?

分類Dev

Javaで複数のスレッドを使用してコレクションを反復処理する方法はありますか?2つのスレッドがコレクションの同じ部分を反復処理することはありませんか?

分類Dev

CUPとJflexを使用して現在の解析アクションを表示する方法はありますか?

分類Dev

Smokeを使用してクラスのアノテーションを取得する方法はありますか?

分類Dev

JAXBを使用してMyBeanのコレクションをマーシャル/マーシャル解除する方法

分類Dev

PowerShellを使用してファイル内のコンテンツのセクションを変更する方法はありますか?

分類Dev

li要素に対して複数のアクションを使用する方法はありますか?

分類Dev

BlenderのPythonスクリプトでアクションキーフレームをコピーして貼り付ける方法はありますか?

分類Dev

拡張クラスタイプでJavaコレクションを使用する方法はありますか?

分類Dev

Waterlineコレクションを切り捨てる迅速で汚い方法はありますか?

分類Dev

Surface.copy()を使用してサーフェスの特定のセクションをコピーする方法はありますか?

分類Dev

Swiftコレクションからnil値を削除するO(1)の方法はありますか?

分類Dev

現在のディレクトリ設定を使用して `--app`オプションを省略する方法はありますか?

分類Dev

オブジェクトのコレクションを反復処理するときにng-controllerを動的に割り当てる方法はありますか?

分類Dev

発射体を使用してcmakeプロジェクトでコンパイルディレクトリを指定する方法はありますか?

分類Dev

DSpaceでXSLTを使用するだけで、アイテムの所有コレクションのハンドルを決定する方法はありますか?

分類Dev

JavaScriptを使用してDocPadコレクションをどのように構成しますか?「警告:カスタムコレクションXYZは有効なコレクションインスタンスではありません」

分類Dev

リフレクションを介してオプションのGUIDのDefaultValueを取得しますか?

分類Dev

クラスのプロパティとしてコレクションを使用する(引数はオプションではありません)

分類Dev

コレクションの最大サイズを設定する方法はありますか?

分類Dev

Firebase関数:複数のコレクションを非同期で反復する方法はありますか?

分類Dev

一般的なタイプのコレクションを操作する方法はありますか?

分類Dev

コレクション内のどのモデルインスタンスが変更されているかを確認する方法はありますか?

分類Dev

Javaを使用してスクリーンショットを撮り、それをある種の画像に保存する方法はありますか?

Related 関連記事

  1. 1

    JAXBを使用してコレクションのdefaultValueを指定する方法はありますか?

  2. 2

    Laravelで特定のモデルのコレクションとして引数を指定する方法はありますか?

  3. 3

    Guavaを使用してコレクションを変換するときにnullを削除するエレガントな方法はありますか?

  4. 4

    セキュリティルールを使用してCloud Firestoreコレクションのサイズを確認する方法はありますか?

  5. 5

    Rustのスタックでコレクションを使用する方法はありますか?

  6. 6

    linqを使用してコレクションから特定のコレクションを取得する方法は?

  7. 7

    Javaで複数のスレッドを使用してコレクションを反復処理する方法はありますか?2つのスレッドがコレクションの同じ部分を反復処理することはありませんか?

  8. 8

    CUPとJflexを使用して現在の解析アクションを表示する方法はありますか?

  9. 9

    Smokeを使用してクラスのアノテーションを取得する方法はありますか?

  10. 10

    JAXBを使用してMyBeanのコレクションをマーシャル/マーシャル解除する方法

  11. 11

    PowerShellを使用してファイル内のコンテンツのセクションを変更する方法はありますか?

  12. 12

    li要素に対して複数のアクションを使用する方法はありますか?

  13. 13

    BlenderのPythonスクリプトでアクションキーフレームをコピーして貼り付ける方法はありますか?

  14. 14

    拡張クラスタイプでJavaコレクションを使用する方法はありますか?

  15. 15

    Waterlineコレクションを切り捨てる迅速で汚い方法はありますか?

  16. 16

    Surface.copy()を使用してサーフェスの特定のセクションをコピーする方法はありますか?

  17. 17

    Swiftコレクションからnil値を削除するO(1)の方法はありますか?

  18. 18

    現在のディレクトリ設定を使用して `--app`オプションを省略する方法はありますか?

  19. 19

    オブジェクトのコレクションを反復処理するときにng-controllerを動的に割り当てる方法はありますか?

  20. 20

    発射体を使用してcmakeプロジェクトでコンパイルディレクトリを指定する方法はありますか?

  21. 21

    DSpaceでXSLTを使用するだけで、アイテムの所有コレクションのハンドルを決定する方法はありますか?

  22. 22

    JavaScriptを使用してDocPadコレクションをどのように構成しますか?「警告:カスタムコレクションXYZは有効なコレクションインスタンスではありません」

  23. 23

    リフレクションを介してオプションのGUIDのDefaultValueを取得しますか?

  24. 24

    クラスのプロパティとしてコレクションを使用する(引数はオプションではありません)

  25. 25

    コレクションの最大サイズを設定する方法はありますか?

  26. 26

    Firebase関数:複数のコレクションを非同期で反復する方法はありますか?

  27. 27

    一般的なタイプのコレクションを操作する方法はありますか?

  28. 28

    コレクション内のどのモデルインスタンスが変更されているかを確認する方法はありますか?

  29. 29

    Javaを使用してスクリーンショットを撮り、それをある種の画像に保存する方法はありますか?

ホットタグ

アーカイブ