Mam wyjątek, gdy próbuję serializować bardzo prosty obiekt za pomocą Jacksona. Błąd:
org.codehaus.jackson.map.JsonMappingException: Nie znaleziono serializatora dla klasy MyPackage.TestA i nie znaleziono właściwości do utworzenia BeanSerializer (aby uniknąć wyjątku, wyłącz SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))
Poniżej znajduje się prosta klasa i kod do serializacji.
Czy ktoś może mi powiedzieć, dlaczego dostaję ten błąd?
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();
}
Odpowiedzi:
Jak już opisano, domyślną konfiguracją
ObjectMapper
instancji jest dostęp tylko do właściwości, które są polami publicznymi lub mają publiczne obiekty pobierające / ustawiające. Alternatywą dla zmiany definicji klasy w celu upublicznienia pola lub zapewnienia publicznego gettera / settera jest określenie (do podstawyVisibilityChecker
) innej reguły widoczności właściwości. Jackson 1.9 zapewniaObjectMapper.setVisibility()
wygodę. Na przykład w pierwotnym pytaniu prawdopodobnie skonfigurowałbym to jakoDla Jacksona> 2.0:
Aby uzyskać więcej informacji i szczegółów na temat powiązanych opcji konfiguracji, polecam przejrzenie JavaDocs na
ObjectMapper.setVisibility()
.źródło
myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
{"term":{"call_failed":"true"}}
generuje strukturę yaml jako:filter: map: term: map: call_failed: "true"
Dlaczego generujemap
słowo kluczowe? Jak mogę to usunąć?@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
nad swoją klasąAby Jackson mógł serializować tę klasę,
SomeString
pole musi być albopublic
(teraz jest to izolacja na poziomie pakietu), albo musisz zdefiniować dla niego metody pobierające i ustawiające.źródło
Mam ten sam problem w kodzie źródłowym. Właśnie dodałem
i
problem rozwiązany.
źródło
Problem w moim przypadku polegał na tym, że Jackson próbował serializować pusty obiekt bez atrybutów ani metod.
Jak zasugerowano w wyjątku, dodałem następujący wiersz, aby uniknąć awarii pustych ziaren:
Dla Jackson 1.9
Dla Jackson 2.X
Prosty przykład można znaleźć na temat Jacksona wyłączyć fail_on_empty_beans
źródło
Miałem ten sam problem z klasą potomną, w której miałem kontrolę, mapowanie obiektów było we wspólnym module i było niedostępne. Rozwiązałem go, dodając adnotację do mojej klasy podrzędnej, której obiekt miał być serializowany.
źródło
Jeśli możesz edytować klasę zawierającą ten obiekt, zwykle po prostu dodam adnotację
źródło
org.codehaus.jackson.annotate.JsonIgnore
Ten błąd jest również zgłaszany, jeśli zapomnisz dodać metodę .build () do swojego statusu zwrotu.
Otrzymałem następujący błąd bez metody build ():
źródło
SpringBoot2.0, rozwiązuję go, wykonując kod:
źródło
W przypadku aplikacji Oracle Java dodaj po
ObjectMapper
wystąpieniu:źródło
Miałem podobny problem z opóźnionym ładowaniem za pośrednictwem hibernowanego obiektu proxy. Obejść ten problem, dodając adnotacje do klasy, która leniwie załadowała prywatne właściwości:
źródło
Problem może wynikać z zadeklarowania zmiennej jako
private
. Jeśli zmienisz napublic
, to działa.Lepszą opcją jest użycie do tego metod pobierających i ustawiających.
To rozwiąże problem!
źródło
Znalazłem co najmniej trzy sposoby na zrobienie tego:
public getters
swój byt, który próbujesz serializować;public getters
. Spowoduje to zmianę domyślnej wartości dla JacksonaVisbility=DEFAULT
na miejsce, w@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
którym akceptowane są wszelkie modyfikatory dostępu;ObjectMapper
globalny przez ustawienieobjectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
. Należy tego unikać, jeśli nie potrzebujesz tej funkcji na całym świecie.Wybierz w zależności od potrzeb.
źródło
Oto trzy opcje:
public
public
, dodaj pobierające i ustawiające@JsonIgnore("context")
źródło
Użyj tego na poziomie klasy dla fasoli:
źródło
dodanie settera i gettera również rozwiąże problem, ponieważ został dla mnie rozwiązany. Na przykład:
źródło
Miałem tylko gettery, po dodaniu setterów problemy zostały rozwiązane.
źródło
Chociaż dodałem pobierające i ustawiające, otrzymywałem ten sam błąd. Później znalazłem błąd, tzn. Zgodnie z radą Sonara podłączyłem programy pobierające i ustawiające jako chronione, co było przyczyną problemu. Raz ustaliłem, że działało zgodnie z oczekiwaniami.
źródło
w wiosennym bagażniku 2.2.5
po dodaniu gettera i setera
Dodałem @JsonIgnore na górze pola.
źródło