<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="featuresToEnable"> <array> <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRAP_ROOT_VALUE" /> </array> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
解釋,上面那這個例子是我實際的配置節選,配置輸出json時把對象作為根元素。通過配置jackson的SerializationFeature.WRAP_ROOT_VALUE來達到目的。
SerializationFeature.WRAP_ROOT_VALUE:是否環繞根元素,默認false,如果為true,則默認以類名作為根元素,你也可以通過@JsonRootName來自定義根元素名稱。
objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE,true);
實例:
@JsonRootName("myPojo")
public static class TestPOJO{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
該類在序列化成json后類似如下:{"myPojo":{"name":"aaaa"}}
Spring MVC默認配置就只需一個 <mvc:annotation-driven\>,文檔( http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/mvc.html#mvc-config-enable )里說了會加載一大串converter,而Jackson有很多配置項,要達到能夠自由配置Jackson的目的,按照參考http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/converter/json/Jackson2ObjectMapperFactoryBean.html里的內容,我們還可以做如下配置。
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" p:autoDetectFields="false" p:autoDetectGettersSetters="false" p:annotationIntrospector-ref="jaxbAnnotationIntrospector" /> </property> </bean>
或者
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"> <property name="objectMapper"> <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" p:failOnEmptyBeans="false" p:indentOutput="true"> <property name="serializers"> <array> <bean class="org.mycompany.MyCustomSerializer" /> </array> </property> </bean> </property> </bean>
如果沒有可直接用的setter屬性
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="featuresToEnable"> <array> <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature$WRAP_ROOT_VALUE"/> <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature$CLOSE_CLOSEABLE"/> </array> </property> <property name="featuresToDisable"> <array> <util:constant static-field="com.fasterxml.jackson.databind.MapperFeature$USE_ANNOTATIONS"/> </array> </property> </bean>
進而用自定義Module來配置 ObjectMapper
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="modulesToInstall" value="myapp.jackson.MySampleModule,myapp.jackson.MyOtherModule"/> </bean>
更多Jackson的配置請參考:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/converter/json/Jackson2ObjectMapperFactoryBean.html
