以下是基于Spring Boot 1.3的项目的摘要。JSON序列化是通过Jackson 2.6.3进行的。
我有以下弹簧MVC控制器:
@RequestMapping(value = "/endpoint", method = RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
public Results<Account> getAllAccounts() throws Exception {
return service.getAllAccounts();
}
返回的Results
如下(删除了Getters和Setters):
public class APIResults<T> {
private Collection<T> data;
}
Account
类如下(删除Getters和Setters):
public class Account {
@JsonView(Views.ViewA.class)
private Long id;
@JsonView(Views.ViewB.class)
private String name;
private String innerName;
}
我也有以下JSON视图
public class Views {
public interface ViewA {}
public interface Publisher extends ViewB {}
}
动机是基于某些预测,从同一控制器返回不同的视图。
因此,我正在使用AbstractMappingJacksonResponseBodyAdvice
在运行时设置视图。设置bodyContainer.setSerializationView(Views.ViewA.class)
时,我会得到一个空的JSON结果,而不是仅包含id
属性的对象。
我怀疑这是因为APIResults< T >
中的data
属性未用@JsonView
注释注释的属性包括所有视图(DOC)?
有没有办法在不将@JsonView
注释添加到APIResults< T >
的情况下获得我想要的东西(这不是一个选项)。
我知道我可以使用Jackson Mixin来获得我想要的功能,但是有没有办法使用JSON视图?
您是对的,Spring MVC Jackson2ObjectMapperBuilder
已改进以将Jackson Mapper功能DEFAULT_VIEW_INCLUSION
设置为 false
,因此不序列化的属性data
未被序列化。
要启用该功能,请使用以下配置(XML):
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="defaultViewInclusion" value="true"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
使用此配置,您将使用id
和innerName
使用ViewA
视图时序列化的属性:
{"data":[
{"id":1,"innerName":"one"},
{"id":2,"innerName":"two"},
{"id":3,"innerName":"three"}
]}
此外,您还可以通过向其添加其他视图注释来隐藏innerName
。