Recebo uma exceção ao tentar serializar um objeto muito simples usando Jackson. O erro:
org.codehaus.jackson.map.JsonMappingException: nenhum serializador encontrado para a classe MyPackage.TestA e nenhuma propriedade descoberta para criar BeanSerializer (para evitar exceção, desative SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))
Abaixo está a classe e o código simples para serializar.
Alguém pode me dizer por que recebo esse 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();
}
Respostas:
Como já descrito, a configuração padrão de uma
ObjectMapper
instância é acessar apenas propriedades que são campos públicos ou têm getters / setters públicos. Uma alternativa para alterar a definição de classe para tornar um campo público ou fornecer um getter / setter público é especificar (para o subjacenteVisibilityChecker
) uma regra de visibilidade de propriedade diferente. Jackson 1.9 fornece oObjectMapper.setVisibility()
método de conveniência para fazer isso. Para o exemplo da pergunta original, eu provavelmente configuraria isso comoPara Jackson> 2.0:
Para obter mais informações e detalhes sobre opções de configuração relacionadas, recomendo revisar os JavaDocs
ObjectMapper.setVisibility()
.fonte
myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
{"term":{"call_failed":"true"}}
está gerando estrutura yaml como:filter: map: term: map: call_failed: "true"
Por que está gerandomap
palavra-chave? Como posso removê-lo?@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
acima da sua classePara Jackson serializar essa classe, o
SomeString
campo precisa serpublic
(agora é isolamento no nível do pacote) ou você precisa definir métodos getter e setter para ela.fonte
Eu tenho o mesmo problema no meu código fonte. Acabei de adicionar
e
o problema resolvido.
fonte
O problema no meu caso foi que Jackson estava tentando serializar um objeto vazio sem atributos nem métodos.
Conforme sugerido na exceção, adicionei a seguinte linha para evitar falhas nos beans vazios:
Para Jackson 1.9
Para Jackson 2.X
Você pode encontrar um exemplo simples em jackson disable fail_on_empty_beans
fonte
Eu tive o mesmo problema para uma classe filho em que eu tinha controle, o mapeador de objetos estava em um módulo comum e estava inacessível. Eu o resolvi adicionando esta anotação para minha classe filho cujo objeto deveria ser serializado.
fonte
Se você pode editar a classe que contém esse objeto, geralmente adiciono a anotação
fonte
org.codehaus.jackson.annotate.JsonIgnore
Este erro também é gerado se você esquecer de adicionar o método .build () ao seu status de retorno.
Eu recebi o seguinte erro sem o método build ():
fonte
SpringBoot2.0 , Eu resolvo isso seguindo o código:
fonte
Para aplicativos Oracle Java, adicione isso após a
ObjectMapper
instanciação:fonte
Eu tive um problema semelhante com o carregamento lento por meio do objeto proxy hibernar. Para contornar isso, anotando a classe com propriedades particulares carregadas preguiçosamente com:
fonte
O problema pode ser porque você declarou a variável como
private
. Se você mudar parapublic
, ele funciona.A melhor opção é usar métodos getter e setter para isso.
Isso resolverá o problema!
fonte
Encontrei pelo menos três maneiras de fazer isso:
public getters
à sua entidade que você tenta serializar;public getters
. Isso mudará o padrão para Jackson deVisbility=DEFAULT
para@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
onde os modificadores de acesso são aceitos;ObjectMapper
globalmente, definindoobjectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
. Isso deve ser evitado se você não precisar dessa funcionalidade globalmente.Escolha com base nas suas necessidades.
fonte
Aqui estão as três opções:
public
public
, adicione getters e setters@JsonIgnore("context")
fonte
Por favor, use isso no nível da classe para o bean:
fonte
adicionar setter e getter também resolverá o problema que foi corrigido para mim. Para Ex:
fonte
Eu só tinha getters, depois de adicionar setters também, os problemas foram resolvidos.
fonte
Embora eu tenha adicionado getters e setters, estava recebendo o mesmo erro. Mais tarde, encontrei um bug, ou seja, seguindo o conselho do Sonar, selecionei os getters e setters como protegidos, o que estava causando o problema. Uma vez consertei que funcionava como esperado.
fonte
na bota com mola 2.2.5
depois de adicionar getter e setter
Adicionei @JsonIgnore no topo do campo.
fonte