У меня есть прецедент, где мне нужно поддерживать два набора выходных данных JSON, один с красивыми именами для свойства JSON и один без. Поэтому я решил настроить свой ObjectMapper так, чтобы он игнорировал аннотацию @JsonProperty («красивое имя») в полях и использовал имена свойств поля. В этом случае хотелось бы следующий вывод JSONCustom Jackson Object Mapper
{"result":{"data":[{"totalUsers":12345,"totalBooks":883}]}}
Вывод в формате JSON с красивыми названиями хотели бы как следует
{"result":{"data":[{"Total Users":12345,"Total Books":883}]}}
Мой код конфигурации ObjectMapper выглядит
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);
Я смотрел несколько других ответов на SO, которые не работали для меня. Я получаю NPE. Пожалуйста, обратитесь к следующей 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)
Проблема заключается в этой строке кода в на
com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._renameWithWrappers(POJOPropertiesCollector.java:728)
где _annotationIntrospector является нулевой
PropertyName wrapperName = _annotationIntrospector.findWrapperName(member);
Не совсем болит то, что я должен сделать, чтобы acheieve My Цель. Любой совет? Благодарю.
Просто мысли: Вы считаете использовать подмешать-аннотации для довольно напечатанной JSON в вместо этого? (Возможно, я найду время завтра, чтобы посмотреть на вашу реальную проблему.) – nutlike
Я сделал короткий тест и, очевидно, «mapper.configure (MapperFeature.USE_ANNOTATIONS, false);' столкновения с 'mapper.configure (MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME, true);' и 'mapper.setVisibility (PropertyAccessor.FIELD, Visibility.NONE) .setVisibility (PropertyAccessor.GETTER, Visibility.ANY);'. Прямо сейчас я не могу придумать простой способ исправить это, не испортив библиотеку Джексона. Для другого подхода, чтобы решить ваш случай использования взглянуть на мой предыдущий пост. – nutlike
@ гайки-спасибо. Нет, я не пробовал mixin-аннотации, но дам им погулять. – andthereitgoes