Spring @JsonView 如何使用请求参数或标头
Posted
技术标签:
【中文标题】Spring @JsonView 如何使用请求参数或标头【英文标题】:Spring @JsonView how can use request parameter or header 【发布时间】:2016-05-26 00:44:21 【问题描述】:@JsonView
如何使用请求中的like参数:
@JsonView(header="range")
当响应值时,读取请求头range
以排除/包含某些字段
【问题讨论】:
可以实现自定义HandlerMethodReturnValueHandler
spring.io/blog/2014/12/02/… 这是@JsonView on 方法,我想改变它从参数或标题读取,根据参数动态生成的json
耶。但这不会增加您动态添加/删除要序列化的字段的可能性。因此,为了继续进行此操作,您必须实现 2 个自定义请求方法:如“/list/with_range”和“/list”
no,2 方法不好,@JsonView 解析在哪里?我可以将解析更改为从标题读取吗?
【参考方案1】:
JsonView 提供“静态”视图映射。因此,对于您的动态行为,您可以这样做:
// actual request handling is happened here
private ResponseEntity<SomeObject> processRequest();
// request handling with view limit in result
@JsonView(YourDefinedView.class)
@RequestMapping(value = "/request", headers="range=include")
public ResponseEntity<SomeObject> processWithView()
return processRequest();
// request handling without view (no headers specified)
@RequestMapping(value = "/request")
public ResponseEntity<SomeObject> processWithoutView()
return processRequest();
这会将您的客户端映射到相同的请求 url,但取决于标头,它是否会提供视图。您可以创建一组方法,根据标头信息使用不同的@JsonView
。
但是这样你只会限制传输到客户端的数据,整个数据加载将发生在服务器上。例如对于数据库和 JPA,如果您不想从数据库中获取所有数据,您将以 javax.persistence.NamedEntityGraphs
结尾,这将改变您的应用程序的一般逻辑 - 并且最终会产生 2 种不同的方法。
如果您想公开带有字段列表的自定义标头,以进行序列化 - 自定义 DTO 对象,或 Map<String, Object>
(ugly-ugly-ugly) 或自定义 HandlerMethodReturnValueHandler
可为您提供帮助。
【讨论】:
以上是关于Spring @JsonView 如何使用请求参数或标头的主要内容,如果未能解决你的问题,请参考以下文章
Jackson 的@JsonView、@JsonFilter 和 Spring
Spring MVC Controller中JsonView的动态选择