Serializing with Jackson (JSON) - getting "No serializer found"?
Obtengo la excepción an cuando intento serializar un objeto muy simple usando Jackson. El error:
Org.codehaus.jackson.asignar.JsonMappingException: No se ha encontrado ningún serializador para clase MyPackage.TestA y sin propiedades descubierto para crear BeanSerializer (para evitar excepciones, deshabilitar SerializationConfig.Función.FAIL_ON_EMPTY_BEANS) )
A continuación se muestra la clase simple y el código a serializar.
¿Puede alguien decirme por qué recibo 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();
}
14 answers
Como ya se ha descrito, la configuración por defecto de una instancia ObjectMapper
es solo acceder a propiedades que son campos públicos o tienen getters/setters públicos. Una alternativa a cambiar la definición de clase para hacer un campo público o para proporcionar un getter/setter público es especificar (al VisibilityChecker
subyacente) una regla de visibilidad de propiedad diferente. Jackson 1.9 proporciona el método de conveniencia ObjectMapper.setVisibility()
para hacerlo. Para el ejemplo de la pregunta original, probablemente configuraría esto as
myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
Para obtener más información y detalles sobre las opciones de configuración relacionadas, recomiendo revisar los JavaDocs en ObjectMapper.setVisibility()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-08 11:54:54
Para que Jackson serialice esa clase, el campo SomeString
necesita ser public
(ahora mismo es el aislamiento del nivel de paquete) o necesita definir los métodos getter y setter para él.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-22 17:24:54
Tengo el mismo problema en mi código fuente. Acabo de añadir
Getter
Y
Setter
El problema resuelto.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-12 16:36:11
El problema en mi caso fue que Jackson estaba tratando de serializar un objeto vacío sin atributos ni métodos.
Como se sugirió en la excepción, agregué la siguiente línea para evitar errores en frijoles vacíos:
Para Jackson 1.9
myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
Para Jackson 2.X
myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
Puedes encontrar un ejemplo sencillo en jackson disable fail_on_empty_beans
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-22 17:22:28
Este error también se lanza si se olvida de agregar el .build () método en su estado de retorno.
return Response.status(Status.OK); // fails
return Response.status(Status.OK).build(); // works
Obtuve el siguiente error sin el método build ():
org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.sun.jersey.core.spi.factory.ResponseBuilderImpl
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-07 13:25:02
Si puedes editar la clase que contiene ese objeto, normalmente solo añado la anotación
import com.fasterxml.jackson.annotation.JsonIgnore;
@JsonIgnore
NonSerializeableClass obj;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-16 02:57:21
Tuve el mismo problema para una clase hija donde tenía control, object mapper estaba en un módulo común y era inaccesible. Lo resolví agregando esta anotación para mi clase hija cuyo objeto iba a ser serializado.
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-31 08:44:53
Para las aplicaciones Java de Oracle, agregue esto después de la instanciación ObjectMapper
:
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-22 17:23:46
El problema puede deberse a que ha declarado la variable como private
.
Si lo cambia a public
, funciona.
Mejor opción es usar los métodos getter y setter para ello.
Esto resolverá el problema!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-22 17:23:15
Tuve un problema similar con la carga lenta a través del objeto proxy hibernate. Se sorteó anotando la clase que tiene propiedades privadas cargadas perezosamente con:
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-03 14:56:30
Aquí están las tres opciones:
- Los datos / clase a los que se ha accedido deben ser
public
- Si no
public
, agregue getters & setters - O añadir
@JsonIgnore("context")
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-08 08:35:23
Aunque he añadido getters y setters estaba recibiendo el mismo error. Más tarde encontré un error, que es por el consejo de Sonar cgahnged los getters y setters como protegidos que estaba causando el problema. Una vez arreglé que funcionaba como exppected.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-31 16:23:27
Encontré al menos tres maneras de hacer esto:
- Agrega
public getters
en tu entidad que intentas serializar; - Agregue una anotación en la parte superior de la entidad, si no desea
public getters
. Esto cambiará el valor predeterminado para Jackson deVisbility=DEFAULT
a@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
donde se aceptan los modificadores de acceso; - Cambie su
ObjectMapper
globalmente configurandoobjectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
. Esto debe evitarse si no necesita esta funcionalidad globalmente.
Elija según sus necesidades.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-06 11:07:18
SpringBoot2. 0 ,lo resuelvo siguiendo el código:
@Bean public ObjectMapper objectMapper() {
return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-08 09:58:06