2

オブジェクトをJavaからJavascriptクライアントに戻し、Spring 3の組み込みのJacksonマッパーによってシリアル化されている状況があります(@RequestBody/@ResponseBodyおよびapplication/jsonコンテンツタイプを使用)

私が抱えている問題は、いくつかのクラスがゲッターはあるがセッターがないインターフェースから実装されていることです。

ゲッター値をクライアント側から利用できるようにしたいので、@ JsonIgnoreアノテーションを使用できません。これは、シリアル化と逆シリアル化の両方でプロパティを完全に無視するためです。シリアル化するときにプロパティが必要です。

これを行う他の方法はありますか?

4

2 に答える 2

2

もっと簡単な方法があるかもしれませんが、可能な解決策としてJSON ビューの使用について言及することにしました。このスレッドに例があります。

シリアライゼーションだけでなく、デシリアライゼーションについても別の見方が必要になる場合があります。それは、Jackson 2.0 の機能であり、Spring 3.2 でサポートされ、Spring 3.1 にバックポートされます。シリアライゼーションのみでビューを使用することは、Jackson 1.4 以降の機能です。

頭に浮かぶ別のオプションは、カスタム デシリアライザーを使用することです。

于 2012-10-23T19:57:59.410 に答える
0

私は同じものを探していました。

Jackson docsによると@JsonIgnore、プロパティ、ゲッター、またはセッターに@JsonProperty注釈を設定できます。これは、設定時にこのプロパティが確実に表示されるようにする注釈をセッターに与えない限り、完全なプロパティを非表示にします。残念ながら、それは逆には機能しません。応答でプロパティを表示したかったのですが、リクエストには含めませんでした。

ユースケースは、たとえば自動生成された ID です。私はユーザーにそれを設定したり、見たりしたくありませんが、彼はそれを読むかもしれません。

実際に属性自体を非表示にしてから@JsonAnyGetterメソッドを追加することで、これを実現できます。この方法では、データを任意の形式に変換できます。また、単一の名前、識別子、またはその他の形式のみを表示する複雑な属性クラスを表すのにも役立ちます。後者を行うためのより良い方法がありますが、ユース ケースが複雑すぎない場合は、これで十分です。

例として(これがあまりにも手の込んだ場合は申し訳ありません):

ユーザー:

public class User {

    private String uid;
    private String customerId;
    private String taxSsnId;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getCustomerId() {
        return extCustomerId;
    }

    public void setCustomerId(String extCustomerId) {
        this.extCustomerId = extCustomerId;
    }

    public String getTaxSsnId() {
        return taxSsnId;
    }

    public void setTaxSsnId(String taxSsnId) {
        this.taxSsnId = taxSsnId;
    }

    @JsonIgnore
    public void getId(){
        if (getUid() != null){
            return getUid();
        }
        if (getCustomerId() != null ){
            return getCustomerId();
        }
        return null;
    }
}

設定:

public class Setting {

    @JsonIgnore
    private int id;

    private String key;
    private String value;

    @JsonIgnore
    private User lastUpdatedBy;

    @JsonIgnore
    private Date lastUpdatedAt;

        public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public User getLastUpdatedBy() {
        return lastUpdatedBy;
    }

    public void setLastUpdatedBy(User lastUpdatedBy) {
        this.lastUpdatedBy = lastUpdatedBy;
    }

    public Date getLastUpdatedAt() {
        return lastUpdatedAt;
    }

    public void setLastUpdatedAt(Date lastUpdatedAt) {
        this.lastUpdatedAt = lastUpdatedAt;
    }

    @JsonAnyGetter
    private Map<String, String> other() {
        Map<String, String> map = new LinkedHashMap<String, String>();
        map.put( "id", this.getId());
        map.put( "lastUpdatedBy", this.getLastUpdatedBy().getId());
        SimpleDateFormat format = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z");
        map.put( "lastUpdatedAt", format.format(this.getLastUpdatedAt()) );
        return map;
    }

}

このRequestスキーマを生成します (デシリアライゼーション ビュー):

{
  "key": "string",
  "value": "string"
}

およびこのResponseスキーマ (シリアル化されたビュー):

{
  "key": "string",
  "value": "string",
  "id": "12345",
  "lastUpdatedBy": "String",
  "lastUpdatedAt": "String" 
}
于 2017-03-13T15:54:53.303 に答える