¿Cómo desactivo fail_on_empty_beans en Jackson?

99

Usando jackson 2.1, ¿cómo desactivo el fail_on_empty beansmensaje de error que parece querer que desactive?

Supongo que esto es lo más simple del mundo, pero demonios, es tarde y no he podido encontrar un tutorial simple o algo particularmente obvio en el api. SerializationFactory? ¿Por qué lo hacen tan poco intuitivo y luego hacen que el mensaje de error parezca tan sencillo?

A pesar de que hago como el mensaje de error, quiero decir, es mejor que una NPE.

Supongo que hay una manera de hacer esto usando anotaciones, ¡pero no estoy interesado en usarlas en absoluto para el trabajo simplista que estoy haciendo!

bharal
fuente

Respuestas:

124

Puede hacer esto por clase o globalmente, creo.

Por clase, intente @JsonSerialize antes de la declaración de clase.

Para un mapeador, aquí hay un ejemplo:

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)

El enlace StackOverflow a continuación también tiene un ejemplo para un proyecto Spring.

Para DESCANSAR con Jersey, no recuerdo nada de mi cabeza, pero creo que es similar.


Un par de enlaces desenterré: (1er enlace editado debido al cierre de Codehaus).

Pancakeo
fuente
Usé este hoy temprano, tiene más información, por ejemplo, descubrimiento automático. stackoverflow.com/questions/4362104/…
Pancakeo
1
¿Puede dar un ejemplo sobre cómo usar @JsonSerializepara deshabilitar FAIL_ON_EMPTY_BEANSla declaración de clase?
tuk
2
Han pasado unos años :). Esto podría ayudar: stackoverflow.com/questions/12162413/…
Pancakeo
O puede utilizar el método de desactivación de la clase ObjectMapper como "mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)"
Reddeiah Pidugu
43

Si está utilizando Spring Boot, puede establecer la siguiente propiedad en el archivo application.properties. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = falso

abhishek jain
fuente
22

También puede tener el mismo problema si su clase no contiene ningún método / propiedad pública. Normalmente tengo DTO dedicados para solicitudes y respuestas de API, declarados públicos, pero olvidé en un caso hacer públicos los métodos también, lo que provocó el bean "vacío" en primer lugar.

RJStanford
fuente
13

Probablemente también pueda anotar la clase con @JsonIgnoreProperties(ignoreUnknown=true)para ignorar los campos no definidos en la clase

AllDayAmazing
fuente
1
Esto no funcionará si todo el bean es en realidad nulo
maryoush
12

Si desea obtener un objeto JSON sin campos adicionales, agregue esta anotación a su clase, funcionó perfectamente para mí.

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

También puede agregar esta fila en su archivo application.properties, pero agregará un campo adicional a su JSON.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
user1913615
fuente
Estaba tratando de devolver JSON desde el interior de uno de mis controladores en mi aplicación REST de arranque de primavera y esto lo solucionó por mí.
ninjasense
¡La forma perfecta si tienes un objeto vacío!
Georgi Peev
3

Si usa org.codehaus.jackson.map.ObjectMapper, por favor. usa las siguientes líneas

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

En Jersey Rest Services, simplemente use la anotación JacksonFeatures ...

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

En mi caso, me perdí escribir la anotación @JsonProperty en uno de los campos que estaba causando este error.

Wahib Ul Haq
fuente
1

Agregando una solución aquí para un problema diferente, pero uno que se manifiesta con el mismo error ... Tenga cuidado al construir json sobre la marcha (como respuestas api o lo que sea) para escapar de las comillas dobles literales en los miembros de su cadena. Es posible que esté consumiendo su propio json con formato incorrecto.

Kirk B.
fuente
1

Para solucionar este problema, configure su clase JsonDataFormat como se muestra a continuación

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

que es casi equivalente a,

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

Hola,

Cuando uso mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

Mis valores de objeto json vienen '' en blanco en la página angular significa en respuesta

Resuelto con la ayuda de solo la siguiente configuración

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

En mi caso, no necesitaba deshabilitarlo, sino que tuve que poner este código en la parte superior de mi clase: (y esto resolvió mi 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
fuente