以下是基于Spring Boot 1.3的项目的片段。 Json序列化是通过Jackson 2.6.3进行的。
我有以下Spring MVC控制器:
@RequestMapping(value = "/endpoint", method = RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
public Results<Account> getAllAccounts() throws Exception {
return service.getAllAccounts();
}
返回的Results
如下(删除了getter和setter):
public class APIResults<T> {
private Collection<T> data;
}
Account
类如下(删除了getter和setter):
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
属性的json对象数组。
我怀疑这是因为{{1} data
中的}属性未使用APIResults< T >
进行注释,但不应在所有视图(doc)中包含未注释的属性吗?
有没有办法得到我想要的东西而不将@JsonView
注释添加到@JsonView
(这不是一个选项)。
我知道我可以使用Jackson mixin来获得我想要的功能,但有没有办法使用Json视图呢?
答案 0 :(得分:1)
你是对的,春天MVC Jackson2ObjectMapperBuilder
has been improved将杰克逊映射器功能DEFAULT_VIEW_INCLUSION
设置为false
,因此未注释的属性data
未被序列化。 / p>
要启用此功能,请使用以下配置(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
。