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?