Làm cách nào để tắt fail_on_empty_beans trong Jackson?


99

Sử dụng jackson 2.1, làm cách nào để tắt fail_on_empty beansthông báo lỗi dường như muốn tôi tắt?

Tôi cho rằng đây chỉ là điều đơn giản nhất trên thế giới, nhưng thật là muộn và tôi không thể tìm thấy một hướng dẫn đơn giản hoặc bất cứ điều gì đặc biệt rõ ràng từ api. SerializationFactory? Tại sao họ làm cho nó trở nên không trực quan và sau đó làm cho thông báo lỗi có vẻ đơn giản như vậy?

Mặc dù tôi làm như thông báo lỗi, ý tôi là, nó là tốt hơn so với một NPE.

Tôi cho rằng có một cách để làm điều này bằng cách sử dụng chú thích - nhưng tôi không muốn sử dụng chúng cho công việc đơn giản mà tôi đang làm!

Câu trả lời:


124

Tôi tin rằng bạn có thể làm điều này theo từng lớp hoặc trên toàn cầu.

Đối với mỗi lớp, hãy thử khai báo lớp @JsonSerialize ở trên.

Đối với người vẽ bản đồ, đây là một ví dụ:

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)

Liên kết StackOverflow bên dưới cũng có một ví dụ cho một dự án Spring.

Đối với REST với Jersey, tôi không nhớ rõ về đầu mình, nhưng tôi tin rằng nó tương tự.


Vài liên kết tôi đã đào lên: (liên kết đầu tiên đã chỉnh sửa do Codehaus ngừng hoạt động).


Tôi đã sử dụng cái này sớm hơn hôm nay, có thêm một số thông tin, ví dụ: tự động phát hiện. stackoverflow.com/questions/4362104/…
Pancakeo

1
Bạn có thể cho một ví dụ về cách sử dụng @JsonSerializeđể tắt FAIL_ON_EMPTY_BEANStrên khai báo lớp không?
tuk

2
Được một vài năm :). Điều này có thể hữu ích: stackoverflow.com/questions/12162413/…
Pancakeo,

Hoặc bạn có thể sử dụng phương pháp vô hiệu hóa của lớp ObjectMapper như "mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)"
Reddeiah Pidugu

43

Nếu bạn đang sử dụng Spring Boot, bạn có thể đặt thuộc tính sau trong tệp application.properties. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false


22

Bạn cũng có thể gặp vấn đề tương tự nếu lớp của bạn không chứa bất kỳ phương thức / thuộc tính công khai nào. Tôi thường có DTO dành riêng cho các yêu cầu và phản hồi API, được khai báo là công khai, nhưng trong một trường hợp, tôi đã quên đặt các phương thức ở chế độ công khai - điều này đã gây ra bean "trống" ngay từ đầu.


13

Bạn cũng có thể chú thích lớp @JsonIgnoreProperties(ignoreUnknown=true)để bỏ qua các trường không xác định trong lớp


1
Điều này sẽ không làm việc nếu toàn bộ đậu thực sự là null
maryoush

12

Nếu bạn muốn nhận đối tượng JSON mà không có bất kỳ trường bổ sung nào - vui lòng thêm chú thích này vào lớp của bạn, nó hoạt động hoàn hảo đối với tôi.

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

Bạn cũng có thể thêm hàng này vào tệp application.properties của mình, nhưng hàng này sẽ thêm một trường bổ sung vào JSON của bạn.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

Tôi đã cố gắng trả lại JSON từ bên trong một trong các bộ điều khiển của mình trong ứng dụng REST khởi động mùa xuân của tôi và điều này đã khắc phục sự cố cho tôi.
ninjasense 14/02/19

Cách hoàn hảo nếu bạn có một đối tượng rỗng!
Georgi Peev

3

Nếu bạn sử dụng org.codehaus.jackson.map.ObjectMapper, thì làm ơn. sử dụng những dòng sau

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

2

Trong Jersey Rest Services, chỉ cần sử dụng chú thích JacksonFeatures ...

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

1

Trong trường hợp của tôi, tôi đã bỏ lỡ ghi chú thích @JsonProperty vào một trong các trường gây ra lỗi này.


1

Thêm giải pháp ở đây cho một vấn đề khác, nhưng một giải pháp biểu hiện với cùng một lỗi ... Hãy cẩn thận khi tạo json khi đang chạy (dưới dạng phản hồi api hoặc bất cứ điều gì) để thoát khỏi dấu ngoặc kép theo nghĩa đen trong các thành viên chuỗi của bạn. Bạn có thể đang tiêu thụ json dị dạng của riêng bạn.


1

Để khắc phục sự cố này, hãy cấu hình lớp JsonDataFormat của bạn như bên dưới

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

gần như tương đương với,

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

0
ObjectMapper mapper = new ObjectMapper();

Chào,

Khi tôi sử dụng mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

Giá trị đối tượng json của tôi đến '' trống trong trang góc cạnh nghĩa là phản hồi

Được giải quyết với sự trợ giúp của chỉ các cài đặt bên dưới

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

0

Trong trường hợp của tôi, tôi không cần phải tắt nó, thay vào đó tôi phải đặt mã này lên đầu lớp của mình: (và điều này đã giải quyết được vấn đề của tôi)

    @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.
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.