2

私は問題があります。手伝っていただけませんか。私はアプリケーションを持っています:CXF + Spring + JAXB+REST。そして、クラスを使用してResponseを生成しようとします。BeanJSONProviderクラスがあります。

@XmlRootElement
class Foo {
@XmlElement
private String bar;
}

フィールド値に設定すると:

setBar("true")

また

setBar("false");

JSONProviderは私に戻ります:

"bar":false

しかし、私は期待しています

"bar":"false"

文字列型を使用しているためです。私はそれで何をすべきですか?

4

1 に答える 1

2

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

JAXB(JSR-222)仕様は、JSONバインディングをカバーしていません。REST / JAX-RSコンテキストでは、JAXBマッピングルールをJSON表現に適用するのはプロバイダーの責任です。今日使用されている3つの異なるアプローチがあります。

  1. JettisonのようなライブラリでJAXB実装を使用します。JettisonはStAXインターフェースを実装しますが、JSONを解釈します。このアプローチの利点は、任意のJAXB実装でJSONを生成/消費できることです。このアプローチの欠点は、Jettisonが完全なJSON表現を行うための十分な情報を持っていないことです。Jettisonは"true"、対応するJavaタイプが何であるかを知らなくても文字列を受信するため、ほとんどの場合、おそらく望ましい出力であるため、文字列をJSONブール値として表すことにします。
  2. REST / JAX-RS実装は、特定のJAXB実装を利用してJSONを生成します。このアプローチは最初のアプローチと似ていますが、REST / JAX-RSプロバイダーがJAXBプロバイダーに対して独自の呼び出しを行い、JSON表現がどうあるべきかについてより知識に基づいた推測を行う点が異なります。
  3. JAXB実装は、JSONバインディング実装を提供します。現在、EclipseLink MOXyは、JSONバインディングをサポートする唯一のJAXB実装です。

MOXyの例

String以下は、booleanフィールドを持つドメインオブジェクトです。@XmlSchemaTypeまた、デフォルトの表現をオーバーライドするために使用できる注釈付きのフィールドを追加しました。

package forum11145933;

import javax.xml.bind.annotation.*;

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

    String barString;

    boolean barBoolean;

    @XmlSchemaType(name="boolean")
    String barStringWithXmlTypeBoolean;

    @XmlSchemaType(name="string")
    boolean barBooleanWithXmlTypeString;

}

jaxb.properties

MOXyをJAXBプロバイダーとして指定するにはjaxb.properties、ドメインモデルと同じパッケージで呼び出されるファイルを次のエントリで追加する必要があります。

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

デモ

次のコードは、ドメインオブジェクトをJSONにマーシャリングする方法を示しています。MOXyにはコンパイル時の依存関係がないことに注意してください。

package forum11145933;

import javax.xml.bind.*;

public class Demo {

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

        Root root = new Root();
        root.barString = "true";
        root.barBoolean = true;
        root.barStringWithXmlTypeBoolean = "true";
        root.barBooleanWithXmlTypeString = true;

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty("eclipselink.media-type", "application/json");
        marshaller.marshal(root, System.out);
    }

}

出力

以下は、Demoコードの実行からの出力です。booleanおよびStringプロパティが正しく書き出されていることに注意してください。また、アノテーションを使用すると、aをaとして@XmlSchemaTypeマーシャリングでき、その逆も可能であることに注意してください。booleanString

{
   "root" : {
      "barString" : "true",
      "barBoolean" : true,
      "barStringWithXmlTypeBoolean" : true,
      "barBooleanWithXmlTypeString" : "true"
   }
}

MOXy&JAX-RS

MOXyにはMOXyJsonProvider、JAX-RS環境でJSONプロバイダーとしてMOXyを有効にするために使用できるものが含まれています。

于 2012-06-22T17:08:42.783 に答える