【问题标题】:Support Jackson @JsonFilter async DeferredResult支持 Jackson @JsonFilter async DeferredResult
【发布时间】:2016-05-09 12:42:18
【问题描述】:

基于此Jira

我有这个方法:

val innerResult: DeferredResult[Object] = new DeferredResult[Object]()

override def setResult(result: T): Boolean = {
  val beanPropertyFilter: SimpleBeanPropertyFilter = filter.size match {
    case 0 => SimpleBeanPropertyFilter.serializeAll()
    case _ => SimpleBeanPropertyFilter.filterOutAllExcept("id")
  }

  val filterProvider = new SimpleFilterProvider()
                        .addFilter("propertiesFilter", beanPropertyFilter)

  val wrapper = new MappingJacksonValue(result)
  wrapper.setFilters(filterProvider)
  innerResult.setResult(wrapper)
}

在回复中我看到:

{"headers":{}, "body":[{"id":"573080B50CCDED33E08DA678"}], "statusCode":"OK"}

我想看看:

[{"id":"573080B50CCDED33E08DA678"}]

我做错了什么?

【问题讨论】:

    标签: java scala spring-mvc jackson


    【解决方案1】:

    我不了解 Scala,并且无法遵循您的代码(result 定义在哪里?)。也许添加方法声明并修复缩进?

    无论如何,您似乎获得了整个响应的 JSON 表示,而不仅仅是响应正文。在 Java 中,ResponseEntity 类具有以下属性:

    • headers:响应头(Cache-Control 等)
    • statusCode:响应状态(200 OK、404 Not Found等)
    • body:响应正文(在您的情况下,是一个包含单个对象和 id 字段的数组)

    这部分看起来很可疑:

    val wrapper = new MappingJacksonValue(result)
    innerResult.setResult(wrapper)
    

    看起来您正在获取结果(正文、标题、状态代码)并将其存储在 innerResult 中。仅基于变量名称,这似乎倒退了。

    【讨论】:

    • 不管结果是什么类型都可以。
    【解决方案2】:

    根据@bernie 的方向,完整的代码应该是这样的

     case class FilterDeferredResult[T <: ResponseEntity[_]](properties: Option[Set[String]] = Some(Set.empty), innerResult: DeferredResult[Object]) extends DeferredResult[T] {
       override def setErrorResult(result: scala.Any): Boolean = {
          super.setErrorResult(result)
       }
    
      override def setResult(result: T): Boolean = {
          val beanPropertyFilter: SimpleBeanPropertyFilter = properties match {
             case None => SimpleBeanPropertyFilter.serializeAll()
             case Some(p) => p.size match {
                case 0 => SimpleBeanPropertyFilter.serializeAll()
                case _ => SimpleBeanPropertyFilter.filterOutAllExcept(p)
          }
       }
    
       val filterProvider = new SimpleFilterProvider().addFilter("propertiesFilter", beanPropertyFilter)
       val wrapper = new MappingJacksonValue(result.getBody)
       wrapper.setFilters(filterProvider)
    
       val bodyBuilder = new ResponseEntity(wrapper,result.getHeaders, result.getStatusCode)
    
       innerResult.setResult(bodyBuilder)
      }
    }
    

    所以我需要在第一个的基础上创建一个新的 ResponseEntity,主体包裹在MappingJacksonValue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2010-12-22
      • 2015-05-03
      • 1970-01-01
      相关资源
      最近更新 更多