Recibo una excepción cuando intento serializar un objeto muy simple usando Jackson. El error:
org.codehaus.jackson.map.JsonMappingException: no se encontró un serializador para la clase MyPackage.TestA y no se descubrieron propiedades para crear BeanSerializer (para evitar excepciones, desactive SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))
A continuación se muestra la clase simple y el código para serializar.
¿Alguien puede decirme por qué me sale este error?
public class TestA {
String SomeString = "asd";
}
TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
String testAString = om.writeValueAsString(testA); // error here!
TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Respuestas:
Como ya se describió, la configuración predeterminada de una
ObjectMapper
instancia es solo acceder a las propiedades que son campos públicos o tienen captadores / establecedores públicos. Una alternativa a cambiar la definición de clase para hacer público un campo o para proporcionar un captador / definidor público es especificar (al subyacenteVisibilityChecker
) una regla de visibilidad de propiedad diferente. Jackson 1.9 proporciona elObjectMapper.setVisibility()
método conveniente para hacerlo. Para el ejemplo en la pregunta original, probablemente configuraría esto comoPara Jackson> 2.0:
Para obtener más información y detalles sobre las opciones de configuración relacionadas, recomiendo revisar los JavaDocs en
ObjectMapper.setVisibility()
.fuente
myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
{"term":{"call_failed":"true"}}
está generando estructura yaml como:filter: map: term: map: call_failed: "true"
¿Por qué está generandomap
palabra clave? Como puedo quitarlo ?@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
sobre su clasePara que Jackson serialice esa clase, el
SomeString
campo debe serpublic
(en este momento es un aislamiento a nivel de paquete) o debe definir los métodos getter y setter para él.fuente
Tengo el mismo problema en mi código fuente. Acabo de agregar
y
El problema resuelto.
fuente
El problema en mi caso fue que Jackson estaba tratando de serializar un objeto vacío sin atributos ni métodos.
Como se sugiere en la excepción, agregué la siguiente línea para evitar fallas en los beans vacíos:
Para Jackson 1.9
Para Jackson 2.X
Puede encontrar un ejemplo simple sobre jackson disable fail_on_empty_beans
fuente
Tuve el mismo problema para una clase secundaria donde tenía control, el mapeador de objetos estaba en un módulo común y era inaccesible. Lo resolví agregando esta anotación para mi clase secundaria cuyo objeto debía ser serializado.
fuente
Si puede editar la clase que contiene ese objeto, generalmente solo agrego la anotación
fuente
org.codehaus.jackson.annotate.JsonIgnore
Este error también se produce si olvida agregar el método .build () a su estado de retorno.
Obtuve el siguiente error sin el método build ():
fuente
SpringBoot2.0, lo resuelvo siguiendo el código:
fuente
Para las aplicaciones Oracle Java, agregue esto después de la
ObjectMapper
instanciación:fuente
Tuve un problema similar con la carga diferida a través del objeto proxy hibernate. Lo solucioné anotando la clase que tenía propiedades privadas cargadas de forma diferida con:
fuente
El problema puede deberse a que ha declarado la variable como
private
. Si lo cambia apublic
, funciona.La mejor opción es utilizar métodos getter y setter para ello.
¡Esto resolverá el problema!
fuente
Encontré al menos tres formas de hacer esto:
public getters
a su entidad que intenta serializar;public getters
. Esto cambiará el valor predeterminado para Jackson a partirVisbility=DEFAULT
de@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
donde se aceptan los modificadores de acceso;ObjectMapper
configuración globalmenteobjectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
. Esto debe evitarse si no necesita esta funcionalidad a nivel mundial.Elija según sus necesidades.
fuente
Aquí están las tres opciones:
public
public
, agregue captadores y establecedores@JsonIgnore("context")
fuente
Utilice esto a nivel de clase para el bean:
fuente
agregar setter y getter también resolverá el problema, ya que se solucionó para mí. Por ej .:
fuente
Solo tenía getters, después de agregar setters también, los problemas se resolvieron.
fuente
Aunque agregué getters y setters recibí el mismo error. Más tarde encontré un error, es decir, por consejo de Sonar, identifiqué a los captadores y colocadores como protegidos, lo que estaba causando el problema. Una vez que lo solucioné, funcionó como se esperaba.
fuente
en la bota de primavera 2.2.5
después de agregar getter y setter
Agregué @JsonIgnore en la parte superior del campo.
fuente