デフォルトでは、Struts2 REST プラグインはjson-libを使用して Bean をシリアル化します。を使用している場合はModelDriven
、結果を処理するときにモデルに直接アクセスします。.json
リクエスト URL で拡張子を使用しているため、コンテンツ タイプ ハンドラは拡張子によって選択されます。である必要がありますJsonLibHandler
。
このハンドラーは、配列またはリスト、またはそれ以外のJSONArray.fromObject(obj)
場合を使用して、シリアル化して応答に書き込むことができるものを取得します。obj
JSONObject.fromObject(obj)
JSONObejct
obj
によって返される値です。あなたのgetModel()
場合は になりますproject
。
JsonLibHandler
はデフォルトを使用しているため、フィールドでJsonConfig
ない限り、シリアル化される Bean からプロパティを除外することはできません。public
json-lib の次の機能は、 で強化できますJsonConfig
。
- サイクル検出、2 つのデフォルト戦略があり (デフォルトでは例外がスローされます)、独自の戦略を登録できます
- JSON へのシリアライズ時に一時フィールドをスキップする (デフォルト = スキップしない) JSON へのシリアライズ時に JAP @Transient アノテーション付きメソッドをスキップする (デフォルト = スキップしない)
- JSON にシリアル化するときに Bean プロパティおよび/またはマップ キーを除外する (デフォルト = ['class','metaClass','declaringClass'])
- フィルターは、JSON にシリアル化するとき、または Java に戻すときにプロパティを除外/含めるためのより細かい詳細を提供します。
一部のプロパティを除外できるこのコード スニペットを見つけることができます。
プロパティを除外
String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setExcludes( new String[]{ "double", "boolean" } );
JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON( str, jsonConfig );
assertEquals( "JSON", jsonObject.getString("string") );
assertEquals( 1, jsonObject.getInt("integer") );
assertFalse( jsonObject.has("double") );
assertFalse( jsonObject.has("boolean") );
プロパティを除外する (フィルターを使用)
String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setJsonPropertyFilter( new PropertyFilter(){
public boolean apply( Object source, String name, Object value ) {
if( "double".equals(value) || "boolean".equals(value) ){
return true;
}
return false;
}
});
JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON( str, jsonConfig );
assertEquals( "JSON", jsonObject.getString("string") );
assertEquals( 1, jsonObject.getInt("integer") );
assertFalse( jsonObject.has("double") );
assertFalse( jsonObject.has("boolean") );
ただし、独自のものを使用してContentTypeHandler
デフォルトをオーバーライドするオプションがあります。
別の方法は、Jackson ライブラリを使用してリクエストを処理することです。docs ページで説明されているように: Jackson フレームワークを JSON として使用しますContentTypeHandler
。
デフォルトの JSON コンテンツ ハンドラは、JSON-lib の上に構築されています。JacksonLibHandler
JSON シリアル化に Jackson フレームワークを使用する場合は、json 要求のコンテンツ ハンドラーとしてを構成できます。
pom.xml
まず、jar ファイルをダウンロードして WEB-INF/lib の下に配置するか、 maven をビルド システムとして使用している場合は、次の xml スニペットを依存関係セクションに追加して、jackson 依存関係を Web アプリケーションに追加する必要があります。
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.13</version>
</dependency>
これで、Content Handler を Jackson Content Handler で上書きできるようになりましたstruts.xml
。
<bean type="org.apache.struts2.rest.handler.ContentTypeHandler" name="jackson" class="org.apache.struts2.rest.handler.JacksonLibHandler"/>
<constant name="struts.rest.handlerOverride.json" value="jackson"/>
<!-- Set to false if the json content can be returned for any kind of http method -->
<constant name="struts.rest.content.restrictToGET" value="false"/>
<!-- Set encoding to UTF-8, default is ISO-8859-1 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
その後、@JsonIgnore
注釈を使用できます。