2016-05-09 2 views
0

база по этому JiraПоддержка Джексон @JsonFilter асинхронной DeferredResult

У меня есть этот метод:

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"}] 

что я делаю неправильно?

ответ

2

Я не знаю Scala и не могу выполнить ваш код (где result определено?). Возможно, добавьте объявление метода и исправьте отступ?

В любом случае, похоже, вы получаете представление JSON всего ответа, а не только тело ответа. В Java, то ResponseEntity класс имеет следующие атрибуты:

  • headers: заголовки ответа (Cache-Control и т.д.)
  • statusCode: статус ответа (200 OK, 404 Not Found и т.д.)
  • body: тело ответа (массив с одним объектом с полем идентификатора в вашем случае)

Эта часть кажется подозрительным:

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

Похоже, что вы принимаете результат (тело, заголовок, statusCode) и сохраняете это в innerResult. Основываясь исключительно на именах переменных, это кажется обратным.

+0

это не имеет значения, что Тип результата может быть любым. – igreen

0

на основе @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

Смежные вопросы