fastxml Джексон - не удалось десериализовать Option

Я использую scala и обновил свои зависимости Джексона с 2.5.4 до 2.9.5. Все прошло нормально, но я получил ошибки в моем клиенте для тестирования. Мое приложение представляет собой веб-сервер, и клиент использует swagger, чтобы просмотреть аннотацию, и использовать отражение, чтобы получить тип возвращаемого значения метода, и использовать Джексон, чтобы преобразовать ответ из json в классы случаев scala.

мой код был

val returnType = method.getAnnotations.collectFirst {
  case operation: ApiOperation => operation.responseContainer() match {
    case "List" => ResponseType(operation.response(), Some(classOf[Seq[_]]))
    case _      =>
      if (method.getReturnType == classOf[Option[_]]) ResponseType(operation.response(), Some(classOf[Option[_]]))
      else ResponseType(operation.response(), None)
  }
}.getOrElse(ResponseType(method.getReturnType, None))



def fromJsonCollection(container: Class[_]) = {
  val collectionType = CollectionType.construct(container, jsonSupport.objectMapper.constructType(responseType.clazz))
  jsonSupport.objectMapper.readValue[AnyRef](response.entity.asString, collectionType)
}

CollectionType.construct устарела.

def superClass(cls: Class[_]): JavaType = {
  val parent = cls.getSuperclass
  if (parent == null) null else TypeFactory.unknownType()
}

def fromJsonCollection(container: Class[_]) = {
  val mapper = jsonSupport.objectMapper
  mapper.registerModule(DefaultScalaModule)
  val vars = container.getTypeParameters
  val elemT = mapper.constructType(responseType.clazz)
  val bindings  = if ((vars == null) || (vars.length != 1))  TypeBindings.emptyBindings else TypeBindings.create(container, elemT)

  val collectionType = CollectionType.construct(container, bindings, superClass(container), null, elemT)

  mapper.readValue[AnyRef](response.entity.asString, collectionType)
}

и я пытаюсь использовать новые параметры, но я получаю ошибку

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: не удается найти десериализатор значения для абстрактного типа [тип коллекции; класс scala.Option, содержит [простой тип, класс rest.encryption.CsrResponse]] в [Источник: (String)"{" ЦСР ":"-----BEGIN CERTIFICATE REQUEST-----\nMIICmTCCAYECAQAwVDENMAsGA1UEAwwET0NDTTEPMA0GA1UECgwGTmV0QXBwMREw\nDwYDVQQLDAhUZWwtQXZpdjEfMB0GCSqGSIb3DQEJARYQYWRtaW5AbmV0YXBwLmNv\nbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMd93c0AttQXjwhkb8/W\nh2nGayTvNjSybmRVNM2p4rCOIfNE6TJoEe7+pnmGd4y+UZyue5nMG/xv9c3q6av6\n1OJ4GGkCB5flpiZFW6e0+WdaGWDqIE9VLQeWRqFJsXJ140JfUUSQG8ov9tXlYWcH\nfYhpl4fK0zfRQG6Fj9Q5Pt7WBF22BscKeDItsZ4mobNYeKSD0s0piRpxxQ5T/2Ni \nwH6xXjlrUsd2kNyVpYBUNpfy2tnPei9VXjaZXROBsNui56hipZe5jFC/V+A"[усеченные 502]; символьной линия: 1, колонок: 1] в com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67) по адресу com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1451) по адресу com.fasterxml.jackson.databind.deser.DeseachenNacrialCoreCaseizer) на com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:148) по адресу com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:477) по адресу com.fasterxmlizerind.Oject.Direct Java:4178) в com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3997) в com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3030)

Разве он не должен использовать OptionDeserializerModule?

0 ответов

Другие вопросы по тегам