Bidang abaikan berbasis anotasi khusus dari serialisasi

Pertimbangkan sebuah kasus di mana saya memiliki 2 contoh Object Mapper. Saya ingin seseorang harus mengecualikan bidang yang dianotasi dengan beberapa anotasi khusus dari serialisasi Sementara pembuat peta lainnya menyertakan (mengabaikan anotasi)

Seperti kelas memiliki 3 bidang a,b,c dan c dianotasi dengan beberapa anotasi (katakanlah @IgnoreField) (Keinginan mereka n jumlah kelas, masing-masing akan memiliki Bidang yang tidak dimaksudkan untuk diserialkan)

Sekarang pembuat objek pertama o1 harus membuat serial hanya a dan b. Sedangkan pemeta objek ke-2 o2 dapat membuat serial a,b dan c.

Hal ini dapat terjadi pada kelas mana pun yang memiliki bidang berbeda, beberapa di antaranya mungkin diberi anotasi.


person Rajat Jindal    schedule 24.09.2019    source sumber
comment
Apa pertanyaannya?   -  person BeUndead    schedule 24.09.2019
comment
apakah Anda menemukan solusinya?   -  person Eugen    schedule 24.09.2019


Jawaban (4)


Anda selalu dapat menerapkan JsonSerializer khusus dan mendaftarkannya ke ObjectMapper Anda.

class Bean {
    @Ignore
    String a;
    String b;
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface Ignore {

}

class BeanWithIgnoredFieldsSerializer extends JsonSerializer<Bean> {

    @Override
    public void serialize(final Bean value, final JsonGenerator gen, final SerializerProvider serializers) throws IOException, JsonProcessingException {
        gen.writeStartObject();
        try {
            for (final Field f : Bean.class.getFields()) {
                if (f.isAnnotationPresent(Ignore.class)) {
                    gen.writeStringField(f.getName(), (String) f.get(value));
                }
            }
        } catch (final Exception e) {
            //
        }
        gen.writeEndObject();
    }

}

class BeanModule extends SimpleModule {

    BeanModule() {
        addSerializer(Bean.class, new BeanWithIgnoredFieldsSerializer());
    }
}

void configure(final ObjectMapper om) {
    om.registerModule(new BeanModule());
}

Catatan Saya belum menguji kode ini, tapi itulah gambaran umum bagaimana Anda menambahkan serializer khusus ke OM. Sesuaikan kode dalam metode serialize sesuka Anda.

person sfiss    schedule 24.09.2019
comment
Jika menurut Anda ini menjawab pertanyaan Anda dengan benar, Anda dapat dan mungkin harus menandainya sebagai diterima. Pertimbangkan juga apa yang dikatakan GhostCat dan mungkin pikirkan apakah Anda benar-benar ingin menerapkannya seperti itu. - person sfiss; 11.10.2019

Coba konfigurasikan SimpleBeanPropertyFilter untuk kondisi berbeda.

@JsonFilter("someBeanFilter")
public class SomeBean {
}

SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("someBeanFilter",SimpleBeanPropertyFilter.serializeAllExcept("aFild")); 

ObjectMapper mapper = new ObjectMapper();
mapper.setFilterProvider(filterProvider); 
person Eugen    schedule 24.09.2019

Saya menyarankan Anda untuk mencoba anotasi khusus di sini yang dengannya Anda dapat menempatkan anotasi pada bidang yang diinginkan dan dapat ditempatkan di no mana pun. kelas. Jadi, dengan menggunakan refleksi yang merupakan konsep kunci anotasi khusus, Anda dapat menentukan perilaku apa yang harus dilakukan dengan anotasi ini. Periksa contoh ini:

Contoh Anotasi Khusus

person VISHAL AGGARWAL    schedule 24.09.2019
comment
OP mengetahui tentang anotasi khusus. Bukan itu inti pertanyaannya, jadi jawaban Anda... tidak menjawab apa pun. - person GhostCat; 24.09.2019

Non-jawaban yang berbeda:

Kemungkinan besar ini adalah ide yang buruk.

Anda menulis kode untuk mengomunikasikan niat Anda. Saat Anda menggunakan anotasi itu, Anda memberi tahu "semua orang" bahwa bidang ini harus diabaikan.

Pembaca manusia yang melihat kode Anda mungkin menghabiskan setengah hari bertanya pada dirinya sendiri nanti "dikatakan @IgnoreField untuk a dan c , jadi mengapa a, dan c menampilkan data serial?"

Dengan kata lain, masalah apa pun yang ingin Anda selesaikan di sini, kemungkinan besar jawabannya adalah bukan dengan meretas cara Anda mengabaikan anotasi terkadang.

Solusi "masuk akal" terbaik berikutnya adalah: mengandalkan anotasi khusus yang berbeda, seperti @IgnoreAlways dan sesuatu seperti @OnlyIncludeForXyz. Dengan kata lain: ungkapkan dengan jelas apa yang mungkin terjadi. Daripada menggunakan pemrograman deklaratif, untuk kemudian "berbohong" tentang apa yang Anda nyatakan.

person GhostCat    schedule 24.09.2019
comment
Saya mengerti maksud Anda, tetapi itu hanya contoh anotasi sebenarnya adalah @FieldDescriptor dengan beberapa properti. - person Rajat Jindal; 24.09.2019
comment
@RajatJindal baiklah, maka Anda seharusnya mengatakannya. Itulah alasan mengapa orang menyarankan agar Anda selalu memberikan contoh minimal yang dapat direproduksi daripada hanya menjelaskan masalah Anda secara samar-samar ketentuan. - person GhostCat; 24.09.2019