2

オブジェクトのシリアル化と逆シリアル化に Jackson を使用しています。問題は、フィールドを表示したい場合と表示したくない場合があることです。

実際には @JsonIgnore を使用して、必要のないときにプロパティの出力を回避しています。必要なときは、プロパティを無効にしています

mapper.getSerializationConfig().disable(SerializationConfig.Feature.USE_ANNOTATIONS);

ただし、これにより、必要な他の注釈も無効になります。

必要な結果を得るにはどうすればよいですか? ビューを使用していますか? 例はありますか?

私が欲しいものを理解するためのちょっとしたポジョ:

class User {
private String username;
@JsonIgnore    
private String password;    
    // getter setter
}


writeToDB() {
mapper.getSerializationConfig().disable(SerializationConfig.Feature.USE_ANNOTATIONS);
mapper.writeValueAsString(user);
}

REST API を使用すると、パスワードなしでユーザー名を取得できます (JsonIgnore のおかげです)。

4

2 に答える 2

3

結局、私はこれを別の方法で処理しました。私はJerseyとGuiceを使用していたので、方法を見つけるのが少し難しかったですが、やりました。

基本的には Jackson の MixIn アノテーションを使用しましたが、Jersey を使用して ObjectMapper を Provider に作成し、それを Guice にバインドする必要がありました。

このように、REST サービスを使用している場合、Jersey はプロバイダーで定義された ObjectMapper を使用します。ものを保存するとき、Jackson は標準の ObjectMapper を使用します。

今いくつかのコード。

PrivateUser クラスを作成します。

public abstract class PrivateUser {
  @JsonIgnore abstract String getPassword();
}

プロバイダーを作成します。

@Provider
public class JacksonMixInProvider implements ContextResolver<ObjectMapper> {

  @Override
  public ObjectMapper getContext(Class<?> aClass) {
    final ObjectMapper mapper = new ObjectMapper();
    mapper.getSerializationConfig().addMixInAnnotations(User.class, PrivateUser.class);
    return mapper;
  }
}

そしてそれをバインドします:

bind(JacksonMixInProvider.class).asEagerSingleton();

それでおしまい!:D

これが他の誰かの時間を無駄にするのに役立つことを願っています!

于 2012-06-28T11:01:19.053 に答える
1

パスワードを選択的にシリアル化/無視できるカスタム Jackson シリアライザーを作成することにより、これを別の方法で処理する必要があると思います。

このような注釈は、実行時に不変であると見なされるべきです。を抽出して値を設定するリフレクション トリックがあるかもしれませJsonIgnoreんが、もしそうなら、これは非常に手間がかかります。

于 2012-06-27T18:58:03.250 に答える