2009-05-13 4 views
46

これはかなり単純な要求ですが、私はそれを行う方法を見つけられませんでした。JAXB nullフィールドを使用したマーシャリング

私は基本的にJAXBで、nullフィールドに出会うたびにそれを出力で無視する代わりに空の値に設定するという役割を設定しようとしています。

@XMLRootElement 
Class Foo { 
    Integer num; 
    Date date; 
…. 
} 

日付フィールドがnullの場合、これをXMLファイルにマーシャリングすると、出力にその要素が含まれません。私がしたいことは、出力のすべてのフィールドを含めることです。それらがヌルの場合は、空白と置き換えます。だから、出力は次のようになります。

<foo> 
    <num>123</num> 
    <date></date> 
</foo> 

おかげで、

Jalpesh。

+1

偉大な質問と回答!私も同じ問題に遭遇し、大きな助けとなりました。 –

答えて

4

しかし、空の文字列は日付の有効な字句表現ではないため、そのことはできません。つまり、日付フィールドの値が空のXML文書を生成した場合、正しく検証されません。言い換えれば

、あなたのdate要素がある場合は1以上のminOccursなくnillableは、その後、あなたは絶対に(1以上)をnullにすることはできません日付、(または空白、または他の非値を持っている必要があります)。

+0

私はこの回答の最初の段落をコメントとして使用していましたが(それをアップアップした素敵な人のおかげで!)、私はそれを少しだけ拡張したので、答えとしてもっと役立つと思いました。 :-) –

+1

合意しましたが、xmlの検証は行っていませんが、スキーマはありません。すべてのフィールドを表示すると、最終消費者はこのxmlの意味を理解しやすくなります。 私はXMLスキーマを持たないために私を退屈にする前に、私は自分のデータオブジェクトを消費し、JAXBを使ってXML/Jsonを吐き出す別のフレームワーク(ジャージー)の中からこれを使用しています。だから私が持っている唯一のコントロールは私のデータオブジェクトです。 また、null値をサポートする理由がわかります。データオブジェクトからCSVファイルを生成したいユースケースを考えてみましょう。 marshal.marshal(elem、myContentHandler)を使うことができます。 – Jalpesh

+0

contentHandlerは正しい形式のCSVファイルを生成します。これは、自分のデータフィールドが無視されていない場合にのみ実行できます。 – Jalpesh

1

他の回答に示されているように、有効な日付ではないため無効です。私は同じような問題を扱いたいと思っていました(同じ)。 nullを使用することはできないため、JAXBのデフォルト値メカニズムを使用できます。指定されていない場合、次の値がデフォルトになります。この特別な日付をコードで検出し、この例外のケースを処理できます。

@XmlElement(defaultValue="1970-01-01T00:00:00.0-00:00") 

したがって、日付の値を検出して空にすることはできますが、nullを使用することはできません。

38

お返事ありがとうございます。

Chris Dail - 私はあなたのアプローチを試みましたが、実際には私が望んだことはしませんでした。フィールドのデフォルト値を定義していても、JAXBはnull値を無視していました。

ジャージーフォーラムの誰かが私に文書のセクション2.2.12.8 No Valueを指摘した後、私は答えを見つけ出してしまいました。

... 
<num>5</num> 
<date xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
.... 
:私はこのようなXMLにそれらをマーシャリングする際にJAXBはそれらのフィールドを示すだろう、と付け加えたら

@XmlElement(nillable = true) 

基本的に、私がしなければならなかったすべては私のフィールドに以下を追加しました

+0

偉大な質問と回答 - ここでは、nil構文を簡略化する方法について、フォローアップの質問を投稿しました:http://stackoverflow.com/questions/8198945/how-to-set-non-namespaced-nil-and- datatype-attributes-in-jaxb –

1

MOXyでは、jsonProviderがJAXBの仕事をどのようにしなければならないかを指定できます。

だから、JAX-RSを行うとき、私は良い結果でのTomcat 7の上にこのコードを使用したアプリケーション

から派生クラスに次のコードを追加します。 (eclipselink 2.4.1)

@ApplicationPath("/rest") 
public class RestApplication extends Application 
{ 

    ... 

public Set< Object> getSingletons() 
    { 

    HashSet<Object> set = new HashSet<Object>(1); 
    set.add(newMoxyJsonProvider()); 

    return set; 
    } 


public static MOXyJsonProvider newMoxyJsonProvider() 
    { 

    MOXyJsonProvider result = new MOXyJsonProvider(); 

    //result.setAttributePrefix("@"); 
    result.setFormattedOutput(false); 
    result.setIncludeRoot(false); 
    result.setMarshalEmptyCollections(true); 
    //result.setValueWrapper("$"); 

    return result; 
    } 

Glassfish 3.1.2およびWAS 8。しかし、newMoxyJsonProvider()は不要ですが、JAXBプロバイダはサーバによって設定されます。 MOXyに付属しているGlassfishの場合、私はnull値と同じ問題を目撃しました。 まだ確認していませんが、可能であれば、アプリケーションサーバーレベルでJAXBを設定するという答えがあると思います。

関連する問題