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&lt;String, Object&gt; (ugly-ugly-ugly) 或自定义 HandlerMethodReturnValueHandler 可为您提供帮助。

【讨论】:

以上是关于Spring @JsonView 如何使用请求参数或标头的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 之@JsonView 简单介绍

Jackson 的@JsonView、@JsonFilter 和 Spring

Spring MVC @JsonView使用详解

Spring MVC Controller中JsonView的动态选择

@JsonView 不过滤属性(Spring 4.1.0.RC2,Jackson 2.3.2)

@JsonView的使用