Benutzerdefinierte Jackson-Objekt-Mapper
Ich habe einen Anwendungsfall, wo ich halten müssen, um zwei Sätze von JSON-Ausgabe, eine mit hübschen Namen für die JSON-Eigenschaft und eine ohne. Also beschloss ich, passen meine ObjectMapper, so dass es ignoriert den @JsonProperty("hübscher name") - annotation der Felder und verwendet die Feld-Eigenschaft Namen. In diesem Fall möchte die folgenden JSON-Ausgabe
{"result":{"data":[{"totalUsers":12345,"totalBooks":883}]}}
Die JSON-Ausgabe mit hübschen Namen möchte wie folgt
{"result":{"data":[{"Total Users":12345,"Total Books":883}]}}
Meine ObjectMapper Konfiguration code aussieht
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_EMPTY);
mapper.setSerializationInclusion(Include.NON_NULL);
mapper.configure(MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME, true);
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
mapper.configure(MapperFeature.USE_ANNOTATIONS, false);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.NONE)
.setVisibility(PropertyAccessor.GETTER, Visibility.ANY);
Ich habe mir ein paar andere Antworten auf SO was nicht für mich arbeiten. Ich bekomme eine NPE. Finden Sie in der folgenden stacktrace
java.lang.NullPointerException
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._renameWithWrappers(POJOPropertiesCollector.java:728)
at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collect(POJOPropertiesCollector.java:264)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.collectProperties(BasicClassIntrospector.java:142)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forSerialization(BasicClassIntrospector.java:68)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forSerialization(BasicClassIntrospector.java:11)
at com.fasterxml.jackson.databind.SerializationConfig.introspect(SerializationConfig.java:490)
at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:131)
at com.fasterxml.jackson.databind.ser.SerializerFactory.createSerializer(SerializerFactory.java:53)
at com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:935)
at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:892)
at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:429)
at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:520)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:99)
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:457)
at com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider.writeTo(JacksonJsonProvider.java:583)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.writeMessageBody(JAXRSUtils.java:1173)
at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:259)
at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:155)
at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:86)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:238)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:222)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:163)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:239)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:164)
Das problem ist in dieser Zeile des Codes in
com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._renameWithWrappers(POJOPropertiesCollector.java:728)
wo _annotationIntrospector null ist
PropertyName wrapperName = _annotationIntrospector.findWrapperName(member);
Nicht ganz wund, was soll ich tun, um acheieve mein Ziel. Irgendwelche Ratschläge? Danke.
- Nur ein Gedanke: Haben Sie geprüft, um zu verwenden mixin-Anmerkungen für das schöne gedruckte JSON statt? (Vielleicht finde ich morgen mal schauen, in Ihre eigentliche problem sein.)
- Ich habe einen kurzen test, und offensichtlich
mapper.configure(MapperFeature.USE_ANNOTATIONS, false);
Auseinandersetzungen mitmapper.configure(MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME, true);
undmapper.setVisibility(PropertyAccessor.FIELD, Visibility.NONE).setVisibility(PropertyAccessor.GETTER, Visibility.ANY);
. Jetzt kann ich nicht denken, eine einfache Möglichkeit dies zu beheben ohne Herumspielen mit Jackson ' s Bibliothek. Für einen anderen Ansatz für die Lösung Ihrer use-case Aussehen in meinem vorherigen post. - Danke. Nein, ich habe nicht versucht mixin-Anmerkungen im Text, sondern geben Ihnen ein zu gehen.
- Hinzugefügt ein kleines Beispiel als Antwort, ich hoffe, es hilft Ihnen, begonnen zu erhalten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kleinen Beispiel zu zeigen, eine Lösung für Ihren Anwendungsfall mit Mixins in Verbindung:
...
...
Jackson 2.0 - 2.4 (veraltet 2.5)
Jackson 2.5+
objectMapper.registerModule(new MyMixInModule());