【问题标题】:Custom handler for response body in Jackson / SpringJackson / Spring中响应主体的自定义处理程序
【发布时间】:2021-03-08 13:31:13
【问题描述】:

我正在尝试拦截控制器中返回的对象,以便在 Spring 调用 Jackson 的序列化过程之前创建响应的平面 JSON 结构。

我将支持允许客户端展平响应正文的查询参数。比如:

/v1/rest/employees/{employeId}/id?flat=true

控制器方法看起来像:

public Employee getEmployee(...) {}

我想避免在我的每个服务调用中实现这种扁平化逻辑,并继续返回 Employee 对象。

Spring 中是否有某种工具可以让我 A) 读取查询字符串并 B) 拦截作为响应主体返回的对象?

【问题讨论】:

    标签: java spring spring-boot jackson


    【解决方案1】:

    这是一个想法。可能有更好的方法,但这会奏效:

    定义一个额外的请求映射来做平面映射:

    @RequestMapping(path = "/endpoint", params = {"flat"})
    public String getFlatThing() {
        return flatMapper.writeValueAsString(getThing());
    }
    
    // The Jackson converter will do its ordinary serialization here.
    @RequestMapping(path = "/endpoint")
    public Thing getFlatThing() {
        return new Thing();
    }
    

    “flatMapper”实现可以是任何你喜欢的,只要它有效。 一种选择是先使用 Jackson 的 ObjectMapper 将值写入 json,然后使用 https://github.com/wnameless/json-flattener 将其展平为所需的输出。也可能有一种方法可以定义一个执行平面映射的自定义 ObjectMapper,尽管这需要您做更多的工作。

    【讨论】:

    • 我认为这是唯一的方法,而无需拼凑一些解决方案。我找到了一个 JSON flattening implementation,然后将以与您上面提到的类似的方式调用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2018-08-20
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多