注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB(JSR-222)エキスパートグループのメンバーです。
JAXB(JSR-222)仕様は、JSONバインディングをカバーしていません。REST / JAX-RSコンテキストでは、JAXBマッピングルールをJSON表現に適用するのはプロバイダーの責任です。今日使用されている3つの異なるアプローチがあります。
- JettisonのようなライブラリでJAXB実装を使用します。JettisonはStAXインターフェースを実装しますが、JSONを解釈します。このアプローチの利点は、任意のJAXB実装でJSONを生成/消費できることです。このアプローチの欠点は、Jettisonが完全なJSON表現を行うための十分な情報を持っていないことです。Jettisonは
"true"
、対応するJavaタイプが何であるかを知らなくても文字列を受信するため、ほとんどの場合、おそらく望ましい出力であるため、文字列をJSONブール値として表すことにします。
- REST / JAX-RS実装は、特定のJAXB実装を利用してJSONを生成します。このアプローチは最初のアプローチと似ていますが、REST / JAX-RSプロバイダーがJAXBプロバイダーに対して独自の呼び出しを行い、JSON表現がどうあるべきかについてより知識に基づいた推測を行う点が異なります。
- 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
マーシャリングでき、その逆も可能であることに注意してください。boolean
String
{
"root" : {
"barString" : "true",
"barBoolean" : true,
"barStringWithXmlTypeBoolean" : true,
"barBooleanWithXmlTypeString" : "true"
}
}
MOXy&JAX-RS
MOXyにはMOXyJsonProvider
、JAX-RS環境でJSONプロバイダーとしてMOXyを有効にするために使用できるものが含まれています。