2013-03-06 3 views
2

У меня есть прецедент, где мне нужно поддерживать два набора выходных данных 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 Цель. Любой совет? Благодарю.

+1

Просто мысли: Вы считаете использовать подмешать-аннотации для довольно напечатанной JSON в вместо этого? (Возможно, я найду время завтра, чтобы посмотреть на вашу реальную проблему.) – nutlike

+0

Я сделал короткий тест и, очевидно, «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

+0

@ гайки-спасибо. Нет, я не пробовал mixin-аннотации, но дам им погулять. – andthereitgoes

ответ

3

Небольшой пример, чтобы показать решение для вашего сценария использования с Mixins:

class Data { 
    int totalUsers; 
    int totalBooks; 
} 

...

class DataMixin { 
    @JsonProperty("Total Users") 
    int totalUsers; 
    @JsonProperty("Total Books") 
    int totalBooks; 
} 

...

Джексон 2,0 - 2,4 (устаревшее в версии 2.5)

ObjectMapper mapper = new ObjectMapper(); 
if (pretty) { 
    mapper.addMixInAnnotations(Data.class, DataMixin.class); 
} 

Джексон 2.5+

ObjectMapper mapper = new ObjectMapper(); 
if (pretty) { 
    mapper.addMixin(Data.class, DataMixin.class); 
} 
+1

Интересно, когда я попытался использовать пример, приведенный на http://wiki.fasterxml.com/JacksonMixInAnnotations, для этого, установив его в модуле и используя SetUpContext. Это не сработало для меня. Но я попробовал что-то похожее на пример, который вы разместили, и он работал, т. Е. Не использовал модуль и просто использовал mapper.addMixInAnnotations – andthereitgoes

+0

Помните, что вам нужно зарегистрировать модуль для Джексона, чтобы увидеть его, то есть использовать 'objectMapper.registerModule (новый MyMixInModule ()); ' –

Смежные вопросы