ฟิลด์ละเว้นตามคำอธิบายประกอบที่กำหนดเองจากการทำให้เป็นอนุกรม

พิจารณากรณีที่ฉันมี Object Mapper 2 อินสแตนซ์ ฉันต้องการอย่างใดอย่างหนึ่งต้องยกเว้นฟิลด์ที่มีคำอธิบายประกอบด้วยคำอธิบายประกอบที่กำหนดเองบางส่วนจากการทำให้เป็นอนุกรม ในขณะที่ผู้ทำแผนที่อื่นรวมอยู่ด้วย (ละเว้นคำอธิบายประกอบ)

เช่นเดียวกับคลาสที่มี 3 ฟิลด์ a,b,c และ c มีคำอธิบายประกอบพร้อมคำอธิบายประกอบบางส่วน (เช่น @IgnoreField) (พวกเขาจะมีจำนวนคลาส n แต่ละฟิลด์จะมีฟิลด์ที่ไม่ได้ตั้งใจให้เป็นอนุกรม)

ตอนนี้ผู้ทำแผนที่วัตถุที่ 1 o1 จะต้องทำให้เป็นอนุกรมเฉพาะ a และ b ในขณะที่ผู้ทำแผนที่วัตถุตัวที่ 2 o2 สามารถทำให้ a, b และ c เป็นอนุกรมได้

สิ่งนี้สามารถเกิดขึ้นได้กับคลาสใดก็ตามที่มีฟิลด์ที่แตกต่างกันซึ่งบางคลาสอาจมีคำอธิบายประกอบ


person Rajat Jindal    schedule 24.09.2019    source แหล่งที่มา
comment
คำถามคืออะไร?   -  person BeUndead    schedule 24.09.2019
comment
คุณพบวิธีแก้ปัญหาหรือไม่?   -  person Eugen    schedule 24.09.2019


คำตอบ (4)


คุณสามารถใช้ JsonSerializer แบบกำหนดเองและลงทะเบียนกับ ObjectMapper ของคุณได้ตลอดเวลา

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());
}

หมายเหตุ ฉันยังไม่ได้ทดสอบโค้ดนี้ แต่นั่นเป็นแนวคิดทั่วไปว่าคุณเพิ่มซีเรียลไลเซอร์แบบกำหนดเองให้กับ OM ได้อย่างไร ปรับโค้ดภายในเมธอด serialize ตามที่คุณต้องการ

person sfiss    schedule 24.09.2019
comment
หากคุณคิดว่ามันตอบคำถามของคุณได้ถูกต้อง คุณสามารถและควรทำเครื่องหมายว่ายอมรับแล้ว ลองพิจารณาสิ่งที่ GhostCat พูดและอาจลองคิดดูว่าคุณต้องการนำไปใช้แบบนั้นจริงๆ หรือไม่ - person sfiss; 11.10.2019

ลองกำหนดค่า SimpleBeanPropertyFilter สำหรับเงื่อนไขที่แตกต่างกัน

@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

ฉันขอแนะนำให้คุณลองใช้คำอธิบายประกอบแบบกำหนดเองที่นี่ ซึ่งคุณสามารถวางคำอธิบายประกอบลงในฟิลด์ที่ต้องการและสามารถวางไว้ในหมายเลขใดก็ได้ ของชั้นเรียน ดังนั้น การใช้การสะท้อนซึ่งเป็นแนวคิดหลักของคำอธิบายประกอบแบบกำหนดเอง คุณสามารถกำหนดลักษณะการทำงานว่าจะทำอย่างไรกับคำอธิบายประกอบนี้ ตรวจสอบตัวอย่างนี้:

ตัวอย่างคำอธิบายประกอบที่กำหนดเอง

person VISHAL AGGARWAL    schedule 24.09.2019
comment
OP รู้เกี่ยวกับคำอธิบายประกอบที่กำหนดเอง นั่นไม่ใช่ประเด็นสำหรับคำถามของเขา ดังนั้นคำตอบของคุณ ... ก็ไม่ตอบอะไรเลย - person GhostCat; 24.09.2019

ไม่ใช่คำตอบที่ชัดเจน:

นี่อาจเป็นความคิดที่แย่มาก

คุณเขียนโค้ดเพื่อสื่อสารความตั้งใจของคุณ เมื่อคุณใช้คำอธิบายประกอบนั้น คุณกำลังบอก "ทุกคน" ว่าควรละเว้นฟิลด์เหล่านี้

ผู้อ่านที่เป็นมนุษย์ในการดูโค้ดของคุณอาจใช้เวลาครึ่งวันถามตัวเองในภายหลังว่า "มันบอกว่า @IgnoreField สำหรับ a และ c แล้วทำไมห่าถึง a และ c แสดงข้อมูลที่ซีเรียลไลซ์"

กล่าวอีกนัยหนึ่ง ไม่ว่าปัญหาใดก็ตามที่คุณพยายามแก้ไขที่นี่ คำตอบมักจะ ไม่ โดยการแฮ็กเข้าสู่ เพิกเฉย คำอธิบายประกอบ ในบางครั้ง

วิธีแก้ปัญหาที่ "สมเหตุสมผล" ที่ดีที่สุดอันดับถัดไปอาจเป็น: ใช้คำอธิบายประกอบแบบกำหนดเองที่แตกต่างกัน เช่น @IgnoreAlways และบางอย่างเช่น @OnlyIncludeForXyz กล่าวอีกนัยหนึ่ง: แสดงให้เห็นอย่างชัดเจนถึงสิ่งที่อาจเกิดขึ้น แทนที่จะใช้โปรแกรมประกาศ เพื่อ "โกหก" เกี่ยวกับสิ่งที่คุณประกาศ

person GhostCat    schedule 24.09.2019
comment
ฉันเข้าใจประเด็นของคุณแล้ว แต่มันเป็นเพียงตัวอย่างคำอธิบายประกอบจริงคือ @FieldDescriptor ที่มีคุณสมบัติบางอย่าง - person Rajat Jindal; 24.09.2019
comment
@RajatJindal ถ้าอย่างนั้นคุณควรจะพูดอย่างนั้น นั่นคือจุดที่ผู้คนแนะนำว่าคุณควรให้ตัวอย่างที่สามารถทำซ้ำได้น้อยที่สุด แทนที่จะอธิบายปัญหาของคุณอย่างคลุมเครือเท่านั้น เงื่อนไข - person GhostCat; 24.09.2019