ฉันจะปิดใช้งาน fail_on_empty_beans ใน Jackson ได้อย่างไร


105

เมื่อใช้แจ็คสัน 2.1 ฉันจะปิดการใช้งานfail_on_empty beansข้อความแสดงข้อผิดพลาดที่ดูเหมือนว่าต้องการให้ฉันปิดใช้งานได้อย่างไร

ฉันสมมติว่านี่เป็นเพียงสิ่งที่ง่ายที่สุดในโลก แต่มันก็สายไปแล้วและฉันไม่สามารถหาบทช่วยสอนง่ายๆหรืออะไรที่ชัดเจนโดยเฉพาะจากไฟล์api. SerializationFactoryเหรอ? ทำไมพวกเขาถึงทำให้มันไม่เข้าใจง่ายแล้วทำให้ข้อความแสดงข้อผิดพลาดดูตรงไปตรงมา

แม้ว่าฉันจะชอบข้อความแสดงข้อผิดพลาด แต่ฉันหมายความว่ามันดีกว่า NPE

ฉันสมมติว่ามีวิธีทำโดยใช้คำอธิบายประกอบ - แต่ฉันไม่กระตือรือร้นที่จะใช้มันเลยสำหรับงานง่ายๆที่ฉันทำ!

คำตอบ:


130

คุณสามารถทำสิ่งนี้ต่อชั้นเรียนหรือทั่วโลกฉันเชื่อ

สำหรับต่อคลาสให้ลองใช้ @JsonSerialize ด้านบนการประกาศคลาส

สำหรับผู้ทำแผนที่นี่คือตัวอย่างหนึ่ง:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// do various things, perhaps:
String someJsonString = mapper.writeValueAsString(someClassInstance);
SomeClass someClassInstance = mapper.readValue(someJsonString, SomeClass.class)

ลิงก์ StackOverflow ด้านล่างมีตัวอย่างสำหรับโครงการ Spring

สำหรับ REST กับ Jersey ฉันจำไม่ได้ว่าปิดหัวไว้ข้างบน แต่ฉันเชื่อว่ามันคล้ายกัน


ลิงก์สองลิงก์ที่ฉันขุดขึ้นมา: (แก้ไขลิงก์ที่ 1 เนื่องจาก Codehaus ปิดตัวลง)


ฉันใช้อันนี้ก่อนหน้านี้วันนี้มีข้อมูลเพิ่มเติมเช่นการค้นหาอัตโนมัติ stackoverflow.com/questions/4362104/…
Pancakeo

1
คุณสามารถยกตัวอย่างวิธีการใช้@JsonSerializeปิดFAIL_ON_EMPTY_BEANSการประกาศคลาสได้หรือไม่?
ตุ๊ก

2
ไม่กี่ปีแล้ว :) สิ่งนี้อาจช่วยได้: stackoverflow.com/questions/12162413/…
Pancakeo

หรือคุณสามารถใช้เมธอดปิดการใช้งานของคลาส ObjectMapper เช่น "mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)"
R Pidugu


22

คุณอาจได้รับปัญหาเดียวกันนี้หากชั้นเรียนของคุณไม่มีวิธีการ / คุณสมบัติสาธารณะใด ๆ โดยปกติฉันมี DTO เฉพาะสำหรับคำขอ API และการตอบกลับโดยประกาศต่อสาธารณะ แต่ในกรณีหนึ่งลืมที่จะทำให้เมธอดเป็นสาธารณะเช่นกันซึ่งทำให้เกิด bean "ว่าง" ในตอนแรก


13

คุณยังสามารถใส่คำอธิบายประกอบในชั้นเรียน@JsonIgnoreProperties(ignoreUnknown=true)เพื่อละเว้นช่องที่ไม่ได้กำหนดไว้ในชั้นเรียน


1
สิ่งนี้จะไม่ได้ผลหากถั่วทั้งหมดเป็นโมฆะจริง
maryoush

12

หากคุณต้องการรับออบเจ็กต์ JSON โดยไม่มีช่องเพิ่มเติมโปรดเพิ่มคำอธิบายประกอบนี้ในชั้นเรียนของคุณมันเหมาะสำหรับฉัน

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

คุณยังสามารถเพิ่มไฟล์ application.properties ในแถวนี้ได้ แต่จะเพิ่มฟิลด์พิเศษให้กับ JSON ของคุณ

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

ฉันพยายามส่งคืน JSON จากภายในหนึ่งในคอนโทรลเลอร์ของฉันในแอป REST สปริงบูตของฉันและสิ่งนี้จะแก้ไขให้ฉัน
ninjasense

วิธีที่ดีที่สุดหากคุณมีวัตถุว่างเปล่า!
Georgi

4

ใน Jersey Rest Services เพียงแค่ใช้คำอธิบายประกอบ JacksonFeatures ...

@JacksonFeatures(serializationDisable = {SerializationFeature.FAIL_ON_EMPTY_BEANS})
public Response getSomething() {
    Object entity = doSomething();
    return Response.ok(entity).build();
}

3

หากคุณใช้ org.codehaus.jackson.map.ObjectMapper กรุณา ใช้บรรทัดต่อไปนี้

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

1

ในกรณีของฉันฉันพลาดที่จะเขียนคำอธิบายประกอบ @JsonProperty ในฟิลด์ใดฟิลด์หนึ่งซึ่งทำให้เกิดข้อผิดพลาดนี้


1

การเพิ่มโซลูชันที่นี่สำหรับปัญหาที่แตกต่างกัน แต่สิ่งที่ปรากฏขึ้นพร้อมกับข้อผิดพลาดเดียวกัน ... โปรดระวังเมื่อสร้าง json ทันที (เป็นการตอบสนอง api หรืออะไรก็ตาม) เพื่อหลีกเลี่ยงเครื่องหมายคำพูดคู่ตามตัวอักษรในสมาชิกสตริงของคุณ คุณอาจใช้ json ที่ผิดรูปแบบของคุณเอง


1

T o แก้ไขปัญหานี้กำหนดค่าคลาส JsonDataFormat ของคุณดังด้านล่าง

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

ซึ่งเกือบจะเทียบเท่ากับ

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

0
ObjectMapper mapper = new ObjectMapper();

สวัสดี

เมื่อฉันใช้ mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

ค่าวัตถุ json ของฉันมา '' ว่างเปล่าในค่าเฉลี่ยเพจเชิงมุมในการตอบสนอง

แก้ไขได้ด้วยความช่วยเหลือของการตั้งค่าด้านล่างเท่านั้น

mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

0

ในกรณีของฉันฉันไม่จำเป็นต้องปิดการใช้งาน แต่ฉันต้องวางรหัสนี้ไว้ที่ด้านบนของชั้นเรียน: (และสิ่งนี้ช่วยแก้ปัญหาของฉันได้)

    @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)//this is what was added
    @Value //this was there already
    @Builder//this was there already

public class NameOfClass {
     //some code in here.
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.