ti-enxame.com

Serializando com Jackson (JSON) - recebendo "Nenhum serializador encontrado"?

Eu recebo uma exceção ao tentar serializar um objeto muito simples usando Jackson. O erro:

org.codehaus.jackson.map.JsonMappingException: Nenhum serializador encontrado para classe MyPackage.TestA e nenhuma propriedade descoberta para criar BeanSerializer (para evitar exceções, desative SerializationConfig.Feature. FAIL_ON_EMPTY_BEANS))

Abaixo está a classe simples e código para serializar. 

Alguém pode dizer o meu porque eu recebo este erro?

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

Como já foi descrito, a configuração padrão de uma instância ObjectMapper é acessar somente propriedades que são campos públicos ou possuem getters/setters públicos. Uma alternativa para alterar a definição de classe para tornar um campo público ou para fornecer um getter/setter público é especificar (para o subjacente VisibilityChecker) uma regra de visibilidade de propriedade diferente. O Jackson 1.9 fornece o método de conveniência ObjectMapper.setVisibility() para fazer isso. Para o exemplo da pergunta original, provavelmente configuraria isso como

myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

Para obter mais informações e detalhes sobre as opções de configuração relacionadas, recomendo revisar os JavaDocs em ObjectMapper.setVisibility() .

279
Programmer Bruce

Para Jackson serializar essa classe, o campo SomeString precisa ser public (agora é o isolamento no nível do pacote) ou você precisa definir os métodos getter e setter para isso.

64
Chris

Eu tenho o mesmo problema no meu código-fonte. Acabei de adicionar 

getter

setter

o problema resolvido.

35
Günay Gültekin

O problema no meu caso foi Jackson estava tentando serializar um objeto vazio sem atributos nem métodos.

Como sugerido na exceção, adicionei a seguinte linha para evitar falhas nos beans vazios:

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

Você pode encontrar um exemplo simples em jackson disable fail_on_empty_beans

20
Martín C

Eu tive o mesmo problema para uma classe filha onde eu tinha controle, o mapeador de objetos estava em um módulo comum e estava inacessível. Eu resolvi adicionando essa anotação para minha classe filha cujo objeto era serializado.

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
6
Pavan Kumar

Este erro também é lançado se você esquecer de adicionar o método .build () ao seu status de retorno.

return Response.status(Status.OK);         // fails
return Response.status(Status.OK).build(); // works

Eu tenho o seguinte erro sem o método build ():

org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.Sun.jersey.core.spi.factory.ResponseBuilderImpl
5
patrics

Se você pode editar a classe que contém esse objeto, eu costumo adicionar a anotação

import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIgnore 
NonSerializeableClass obj;
5
ZiglioUK

Para aplicativos Oracle Java, inclua isto após a instanciação ObjectMapper

mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
3
LEMUEL ADANE

O problema pode ser porque você declarou uma variável como private. Se você alterá-la para public, ela funcionará.

A melhor opção é usar os métodos getter e setter para isso.

Isso vai resolver o problema!

2
Sanchit Singhania

Aqui estão as três opções:

  1. Dados/classes que foram acessados ​​precisam ser public
  2. Se não for public, adicione getters & setters
  3. Ou adicione @JsonIgnore("context")
2
Santhosh Kumar

Eu encontrei pelo menos três maneiras de fazer isso:

  1. Adicione public getters na sua entidade que você tentou serializar;
  2. Adicione uma anotação no topo da entidade, se você não quiser public getters. Isso mudará o padrão para Jackson de Visbility=DEFAULT para @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY), onde qualquer modificador de acesso é aceito;
  3. Altere sua ObjectMapper globalmente definindo objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);. Isso deve ser evitado se você não precisar dessa funcionalidade globalmente.

Escolha com base em suas necessidades.

1
georger

Eu tive um problema semelhante com carregamento lento por meio do objeto de proxy de hibernação. Deu a volta anotando a classe tendo propriedades privadas carregadas com:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
1
N. berouain

Embora eu tenha adicionado getters e setters, recebi o mesmo erro. Mais tarde eu encontrei um bug, que é por conselho do Sonar que eu cgahnged os getters e setters como protegidos que estava causando o problema. Uma vez eu consertei que funcionou como esperado.

0
yellow

SpringBoot2.0, eu resolvo seguindo o código:

@Bean public ObjectMapper objectMapper() {
 return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}
0
Janus