2016-02-12 39 views
0

我有一個使用Apache CXF的JAX-RS API。最近我從Jettison轉換到Jackson(2.7.1)進行JSON處理。我正在使用JacksonJaxbJsonProvider。您可以在JAX-RS中全局設置Jackon的Include.NON_NULL嗎?

我需要做的一件事就是確保JSON中的空字段不被渲染。對於我使用的類級以下注釋:

@JsonInclude(JsonInclude.Include.NON_NULL) 
public class Book { 
... 
} 

有什麼辦法來設置它在全球,這樣我就沒有這個註釋應用到每一個班級?

隨着Jettison我能夠在beans.xml文件中指定屬性,有沒有類似的方法可以與傑克遜實現NON_NULL行爲?

<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.json.JSONProvider"> 
    <property name="dropRootElement" value="true"/> 
    <property name="supportUnwrapped" value="true"/> 
    </bean> 

我已經看到了一些建議,實例化時設置該屬性上ObjectMapper水平,但是使用Apache CXF的時候我從來沒有手動創建ObjectMapper,因爲這個實例是由框架處理(可能發生在某處JacksonJaxbJsonProvider) 。

有沒有辦法在全局範圍內設置NON_NULL屬性?

回答

1

可以包括如下配置如下:

<bean id="jacksonJaxbJsonProvider" 
    class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider"> 
    <constructor-arg ref="objectMapper"></constructor-arg> 
</bean> 

<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"> 
    <property name="serializationInclusion" value="NON_NULL"></property> 
</bean> 
+0

這對我幫助很多 - 我通過改變構造函數參數工作到\t \t 。否則,它在創建JacksonJaxbJsonProvider時抱怨將ObjectMapper轉換爲Annotations []。我還需要將第二個bean移至beans.xml文件中的頂級bean元素。 –

1

萬一它可以幫助別人,在beans.xml中配置ObjectMapper與NON_NULL工作然而我JAXB註釋停止工作。爲了讓他們都在同一時間我使出創造我自己的ObjectMapper供應商合作:

@Provider 
public class CustomJacksonObjectMapperProvider implements ContextResolver<ObjectMapper> { 

    final ObjectMapper defaultObjectMapper; 

    public CustomJacksonObjectMapperProvider() { 
     defaultObjectMapper = createDefaultMapper(); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> type) { 
     return (defaultObjectMapper); 
    } 

    private static ObjectMapper createDefaultMapper() { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.setSerializationInclusion(Include.NON_NULL); 
     mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     mapper.setAnnotationIntrospector(
      AnnotationIntrospector.pair(
       new JacksonAnnotationIntrospector(), 
       new JaxbAnnotationIntrospector(mapper.getTypeFactory()) 
     )); 
     return (mapper); 
    } 
} 

在beans.xml中對其進行註冊(jaxrs:providers下)如下:

<bean id="customJacksonObjectMapperProvider" class="CustomJacksonObjectMapperProvider"/> 
相關問題