Como desativo fail_on_empty_beans em Jackson?

99

Usando jackson 2.1, como desativo o fail_on_empty beansque a mensagem de erro parece querer que eu desative?

Presumo que seja a coisa mais simples do mundo, mas, droga, é tarde e não consegui encontrar um tutorial simples ou algo particularmente óbvio no api. SerializationFactory? Por que eles tornariam isso tão pouco intuitivo e, em seguida, fariam a mensagem de erro parecer tão direta?

Apesar de eu fazer , como a mensagem de erro, quero dizer, é melhor do que um NPE.

Presumo que haja uma maneira de fazer isso usando anotações - mas não estou interessado em usá-las para o trabalho simplista que estou fazendo!

bharal
fonte

Respostas:

124

Você pode fazer isso por classe ou globalmente, eu acredito.

Para por classe, tente @JsonSerialize acima da declaração de classe.

Para um mapeador, aqui está um exemplo:

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)

O link StackOverflow abaixo também tem um exemplo para um projeto Spring.

Para REST com Jersey, não me lembro de cara, mas acredito que seja semelhante.


Alguns links que desenterrei: (editei o primeiro link devido ao encerramento do Codehaus).

Panqueca
fonte
Eu usei este mais cedo hoje, tem mais algumas informações, por exemplo, descoberta automática. stackoverflow.com/questions/4362104/…
Pancakeo,
1
Você pode dar um exemplo de como @JsonSerializedesabilitar FAIL_ON_EMPTY_BEANSna declaração de classe?
tuk
2
Já faz alguns anos :). Isso pode ajudar: stackoverflow.com/questions/12162413/…
Pancakeo
Ou você pode usar o método de desativação da classe ObjectMapper como "mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)"
Reddeiah Pidugu
43

Se estiver usando Spring Boot, você pode definir a seguinte propriedade no arquivo application.properties. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false

abhishek jain
fonte
22

Você também pode ter o mesmo problema se sua classe não contiver nenhum método / propriedade pública. Eu normalmente dedico DTOs para solicitações e respostas de API, declarado público, mas esqueci em um caso de tornar os métodos públicos também - o que causou o bean "vazio" em primeiro lugar.

RJStanford
fonte
13

Você também pode provavelmente anotar a classe com @JsonIgnoreProperties(ignoreUnknown=true)para ignorar os campos indefinidos na classe

AllDayAmazing
fonte
1
Isso não funcionará se o feijão inteiro for realmente nulo
maryoush
12

Se você deseja obter o objeto JSON sem campos extras - adicione esta anotação à sua classe, funcionou perfeitamente para mim.

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

Você também pode adicionar em seu arquivo application.properties esta linha, mas irá adicionar um campo extra ao seu JSON.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
user1913615
fonte
Eu estava tentando retornar JSON de dentro de um dos meus controladores em meu aplicativo REST de boot de mola e isso corrigiu para mim.
ninjasense de
A maneira perfeita se você tem um objeto vazio!
Georgi Peev
3

Se você usar org.codehaus.jackson.map.ObjectMapper, então, pls. use as seguintes linhas

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
thangamanikasi
fonte
2

Em Jersey Rest Services, basta usar a anotação JacksonFeatures ...

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

No meu caso, deixei de escrever a anotação @JsonProperty em um dos campos que estava causando este erro.

Wahib Ul Haq
fonte
1

Adicionando uma solução aqui para um problema diferente, mas que se manifesta com o mesmo erro ... Tome cuidado ao construir json dinamicamente (como respostas de api ou qualquer outra) para escapar de aspas duplas literais em seus membros de string. Você pode estar consumindo seu próprio json malformado.

Kirk B.
fonte
1

Para corrigir este problema, configure sua classe JsonDataFormat como abaixo

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

que é quase equivalente a,

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
Reddeiah Pidugu
fonte
0
ObjectMapper mapper = new ObjectMapper();

Oi,

Quando eu uso mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

Meus valores de objeto json vêm '' em branco no significado da página angular em resposta

Resolvido apenas com a ajuda das configurações abaixo

mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
Shahid Hussain Abbasi
fonte
0

No meu caso, não precisei desativá-lo, em vez disso, tive que colocar este código no topo da minha classe: (e isso resolveu meu problema)

    @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.
}
AppEmmanuel
fonte