¿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!

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).


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


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.


13

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


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

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);

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();
}

1

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


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.


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);

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));

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.
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.