同じ状況で、私はそれを理解しました。解決策は、@JsonView
とスプリングを使用して、ObjectMapper
をジャーナルの美しさを殺すことなくJSON Writerに挿入できるようにすることです。
私はのインスタンスのリストとSystemObject
という特定のインスタンスの詳細を取得したいと思います。ちょうどあなたのように、私はちょうどあなたのように各インスタンスのプロパティの数をリスト内のいくつかの追加のプロパティと詳細については、私はそれらのビューを定義し、SystemObject
クラスのアノテーションを追加します。デフォルトでは、@JsonView
注釈のないすべてのプロパティがJSONに出力されますが、除外に使用できる設定item(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION)
があります。
問題は、自分の必要性を満たすためにはそれを真に設定しなければならないということです。オブジェクトをJSONに変換するObjectMapperを変更することはできません。以下の3つの記事を読んで、私ができる方法はModified ObjectMapper
をJerseyに挿入することです。 今私は欲しいものを手に入れました。
データベーステーブルに対して複数のビューを作成するようです。
これらの3つのリンクは、さまざまな方法であなたを助ける:
How to create a ObjectMapperProvider which can be used by Spring to inject
Jersey, Jackson, Spring and JSON
Jersey + Spring integration example
RESTリソース:
package com.john.rest.resource;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.UriInfo;
import org.codehaus.jackson.map.annotate.JsonView;
import org.springframework.stereotype.Component;
import com.midtronics.esp.common.EspException;
import com.midtronics.esp.common.SystemObject;
import com.midtronics.esp.mobile.model.SystemObjectView;
import com.midtronics.esp.model.accesscontrol.AccessControlBean;
import com.midtronics.esp.model.site.SiteBean;
@Component
@Path("/hierarchy")
public class Hierarchy {
// Allows to insert contextual objects into the class,
// e.g. ServletContext, Request, Response, UriInfo
@Context
UriInfo uriInfo;
@Context
Request request;
// Return the list of sites
@GET
@Path("sites")
@Produces(MediaType.APPLICATION_JSON)
@JsonView({SystemObjectView.ObjectList.class})
public List<SystemObject> listSite(
@HeaderParam("userId") String userId,
@HeaderParam("password") String password) {
ArrayList<SystemObject> sites= new ArrayList<SystemObject>();
try{
if(!AccessControlBean.CheckUser(userId, password)){
throw new WebApplicationException(401);
}
SystemObject.GetSiteListByPage(sites, 2, 3);
return sites;
} catch(EspException e){
throw new WebApplicationException(401);
} catch (Exception e) {
throw new WebApplicationException(500);
}
}
// Return the number of sites
@GET
@Path("sites/total")
@Produces(MediaType.TEXT_PLAIN)
public String getSiteNumber(@HeaderParam("userId") String userId,
@HeaderParam("password") String password) {
try{
return Integer.toString(SiteBean.GetSiteTotal());
} catch(EspException e){
throw new WebApplicationException(401);
} catch (Exception e) {
throw new WebApplicationException(500);
}
}
}
RESTモデル:
package com.john.rest.model;
import java.io.Serializable;
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlRootElement;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.annotate.JsonView;
import com.midtronics.esp.mobile.model.SystemObjectView;
import com.midtronics.esp.model.common.ICommonDAO;
@XmlRootElement
public class SystemObject implements Serializable
{
private static final long serialVersionUID = 3989499187492868996L;
@JsonProperty("id")
@JsonView({SystemObjectView.ObjectList.class, SystemObjectView.ObjectDetail.class})
protected String objectID = "";
@JsonProperty("parentId")
protected String parentID = "";
@JsonProperty("name")
@JsonView({SystemObjectView.ObjectList.class, SystemObjectView.ObjectDetail.class})
protected String objectName = "";
//getters...
//setters...
}
RESTモデルビュー:
package com.john.rest.model;
public class SystemObjectView {
public static class ObjectList { };
public static class ObjectDetail extends ObjectList { }
}
私はこれを20回投票することができれば、私はだろう。この記事を読むまで、JerseyViewをJerseyリソースメソッドに適用して、シリアライズするビューを選択することはできませんでした。それがドキュメントに記述されていれば私は完全にそれを逃した。 BTW - Springなしで動作します(私はFelixを使用しています)。どうもありがとう! – sfitts
私はあなたがドキュメントでこれを見逃したとは思わない。私は長い間これを行う良い方法を探していましたが、私はこの記事を見て初めて見つけました。 –
JAX-RSエンドポイントに適用できる注釈の簡単な説明(https://github.com/FasterXML/jackson-jaxrs-providers)とうまくいけば他のコンテナ(Spring、Restlet) /類似のものを追加/追加する。 – StaxMan