9

いくつかの場合にのみ一時的な情報をシリアル化する可​​能性を探しています:

@JsonInclude(Include.NON_NULL)
@Entity
public class User {

    public static interface AdminView {}

    ... id, email and others ...

    @Transient
    private transient Details details;

    @JsonIgnore                  // Goal: ignore all the time, except next line
    @JsonView(AdminView.class)   // Goal: don't ignore in AdminView
    public Details getDetails() {
        if (details == null) {
            details = ... compute Details ...
        }
        return details;
    }
}

public class UserDetailsAction {
    private static final ObjectWriter writer = new ObjectMapper();
    private static final ObjectWriter writerAdmin = writer
        .writerWithView(User.AdminView.class);

    public String getUserAsJson(User user) {
        return writer.writeValueAsString(user);
    }

    public String getUserAsJsonForAdmin(User user) {
        return writerAdmin.writeValueAsString(user);
    }
}

getUserAsJson を呼び出すと、id、email、その他のフィールドが表示されるはずでしたが、詳細は表示されませんでした。これはうまくいきます。しかし、getUserAsJsonForAdmin についても同じことがわかりますが、詳細もありません。@JsonIgnore アノテーションを削除すると、両方の呼び出しで詳細が表示されます。

私は何を間違っていますか?良い方法はありますか?ありがとう!

4

2 に答える 2

1

ジャクソンは@JsonViewのような非常にクールな機能について恐ろしいコンセプトを持っているようです。私の問題を解決する唯一の方法は次のとおりです。

@JsonInclude(Include.NON_NULL)
@Entity
public class User {

    public static interface BasicView {}
    public static interface AdminView {}

    ... id and others ...

    @JsonView({BasicView.class, AdminView.class}) // And this for EVERY field
    @Column
    private String email;

    @Transient
    private transient Details details;

    @JsonView(AdminView.class)
    public Details getDetails() {
        if (details == null) {
            details = ... compute Details ...
        }
        return details;
    }
}

public class UserDetailsAction {
    private static final ObjectWriter writer = new ObjectMapper()
        .disable(MapperFeature.DEFAULT_VIEW_INCLUSION)
        .writerWithView(User.BasicView.class);
    private static final ObjectWriter writerAdmin = new ObjectMapper()
        .disable(MapperFeature.DEFAULT_VIEW_INCLUSION)
        .writerWithView(User.AdminView.class);

    public String getUserAsJson(User user) {
        return writer.writeValueAsString(user);
    }

    public String getUserAsJsonForAdmin(User user) {
        return writerAdmin.writeValueAsString(user);
    }
}

多分それは誰かを助けることです。しかし、私はより良い解決策を見つけたいと思っています。なぜなら、私自身の答えを受け入れないからです。

編集:インターフェイスは(複数の)インターフェイスを拡張できるため、次を使用できます:

public static interface AdminView extends BasicView {}

そしてただ

@JsonView(BasicView.class)

それ以外の

@JsonView({BasicView.class, AdminView.class})
于 2014-04-19T17:52:36.173 に答える