Jackson’da fail_on_empty_beans’i nasıl devre dışı bırakırım?


104

Jackson 2.1'i kullanarak fail_on_empty beans, hata mesajının devre dışı bırakmamı istiyor gibi görünmesini nasıl devre dışı bırakabilirim?

Bunun dünyadaki en basit şey olduğunu varsayıyorum, ama cehennem geç ve basit bir öğretici ya da api. SerializationFactory? Neden bunu bu kadar sezgisel hale getirip sonra hata mesajını bu kadar basit gösterdiler?

Ben rağmen yapmak hata mesajı gibi, yani, bir NPE daha iyidir.

Ek açıklamaları kullanarak bunu yapmanın bir yolu olduğunu varsayıyorum - ama yaptığım basit iş için onları kullanmaya hiç hevesli değilim!

Yanıtlar:


128

Bunu sınıf başına veya küresel olarak yapabileceğine inanıyorum.

Sınıf başına sınıf bildirimi için @JsonSerialize'ı deneyin.

Bir haritacı için işte bir örnek:

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)

Aşağıdaki StackOverflow bağlantısında ayrıca bir Spring projesi için bir örnek var.

Jersey ile REST için, kafamdan çok fazla hatırlamıyorum, ancak benzer olduğuna inanıyorum.


Çıkardığım birkaç bağlantı: (Codehaus'un kapanması nedeniyle 1. bağlantı düzenlendi).


Bunu bugün erken saatlerde kullandım, biraz daha bilgi var, örneğin otomatik keşif. stackoverflow.com/questions/4362104/…
Pancakeo

1
Sınıf bildirimini @JsonSerializedevre dışı bırakmak FAIL_ON_EMPTY_BEANSiçin nasıl kullanılacağına dair bir örnek verebilir misiniz ?
tuk

2
Birkaç yıl oldu :). Bu yardımcı olabilir: stackoverflow.com/questions/12162413/…
Pancakeo

Veya "mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)" gibi ObjectMapper sınıfının devre dışı bırakma yöntemini de kullanabilirsiniz
R Pidugu

47

Spring Boot kullanıyorsanız, application.properties dosyasında aşağıdaki özelliği ayarlayabilirsiniz. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = yanlış


Evet. Çözüldü.
Ojonugwa Jude Ochalifu

22

Sınıfınız herhangi bir genel yöntem / özellik içermiyorsa, aynı sorunu da alabilirsiniz. Normalde API istekleri ve yanıtları için özel DTO'larım var, halka açık olarak ilan edildi, ancak bir durumda yöntemleri kamuya açık hale getirmeyi unuttum - bu da ilk başta "boş" fasulyeye neden oldu.


13

Ayrıca, sınıftaki @JsonIgnoreProperties(ignoreUnknown=true)tanımsız alanları yok saymak için muhtemelen sınıfa not ekleyebilirsiniz.


1
Tüm fasulye aslında boşsa bu işe yaramayacak
maryoush

12

JSON nesnesini fazladan alan olmadan almak istiyorsanız - lütfen bu notu sınıfınıza ekleyin, benim için mükemmel çalıştı.

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

Ayrıca bu satırı application.properties dosyanıza da ekleyebilirsiniz, ancak JSON'nuza fazladan bir alan ekler.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

İlkbahar önyükleme REST uygulamamdaki denetleyicilerimden birinin içinden JSON'u iade etmeye çalışıyordum ve bu benim için düzeltildi.
ninjasense

Boş bir nesneniz varsa mükemmel bir yol!
Georgi Peev

3

Org.codehaus.jackson.map.ObjectMapper kullanıyorsanız, lütfen. aşağıdaki satırları kullanın

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

3

Jersey Dinlenme Hizmetlerinde sadece JacksonFeatures açıklamasını kullanın ...

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

1

Benim durumumda, bu hataya neden olan alanlardan birine @JsonProperty ek açıklaması yazmayı özledim.


1

Buraya farklı bir problem için, ancak aynı hatayla ortaya çıkan bir çözüm eklemek ... Dizge üyelerinizdeki gerçek çift tırnaktan kaçmak için anında json oluştururken (api yanıtları veya her neyse) dikkatli olun. Kendi hatalı biçimlendirilmiş json'unuzu tüketiyor olabilirsiniz.


1

Bu sorunu gidermek için JsonDataFormat sınıfınızı aşağıdaki gibi yapılandırın

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

bu neredeyse eşdeğerdir,

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

0
ObjectMapper mapper = new ObjectMapper();

Selam,

Kullandığım zaman mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

Json nesne değerlerim yanıt olarak açısal sayfada boş geliyor

Sadece aşağıdaki ayarların yardımı ile çözüldü

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

0

Benim durumumda devre dışı bırakmam gerekmiyordu, bunun yerine bu kodu sınıfımın üstüne koymak zorunda kaldım: (ve bu benim sorunumu çözdü)

    @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.
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.