48

これは非常に単純なリクエストですが、それを行う方法が見つかりませんでした。

私は基本的にJAXBで役割を設定しようとしています。これは、nullフィールドが検出されるたびに、出力で無視するのではなく、空の値に設定することを示しています。だからクラスのために:

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

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

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

ありがとう、

ジャルペッシュ。

4

5 に答える 5

40

答えてくれてありがとう。

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

Jerseyフォーラムの誰かが私にドキュメントセクション2.2.12.8 No Valueを指摘した後、私は答えに出くわしました。

基本的に、私がしなければならなかったのは、フィールドに以下を追加することだけでした:

@XmlElement(nillable = true) 

それを追加すると、JAXB はこれらのフィールドを XML にマーシャリングするときに次のように表示します。

...
<num>5</num>
<date xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
....
于 2009-05-13T22:55:12.133 に答える
4

しかし、しかし...空の文字列は日付の有効な字句表現ではないため、それを行うことはできません。つまり、日付フィールドの値が空の XML ドキュメントを生成すると、適切に検証されません。

つまり、date要素minOccursに 1 以上の があり、 notnillableがある場合、絶対に (1 つ以上) の日付が必要であり、null (または空白、またはその他の非値) にすることはできません。

于 2009-05-13T15:28:50.300 に答える
2

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

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

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

于 2009-05-13T16:45:11.237 に答える
1

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

したがって、JAX-RS を実行する場合は、Application から派生したクラスに次のコードを追加します。

このコードを 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.5 では、newMoxyJsonProvider() は必要ありませんが、JAXB プロバイダーはサーバーによって構成されます。MOXy に付属している Glassfish の場合、null 値で同じ問題が発生しました。まだ確認していませんが、答えは、可能であればアプリケーション サーバー レベルで JAXB を構成することにあると思います。

于 2013-03-05T10:52:29.640 に答える