десериализовать необязательно в kotlin из строки в redis - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь десериализовать необязательный параметр, который я сохраняю как строку в redis, но я всегда возвращаю хэш-карту.Я инстанцирую свой объектный маппер

 private  var objectMapper: ObjectMapper= ObjectMapper().registerModule(KotlinModule())
        .registerModule( Jdk8Module())
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

, сериализирую asi

  redisTemplate.opsForValue().set("key3", objectMapper.writeValueAsString(value))

, и я deserializo asi:

var result1 = objectMapper.readValue<Optional<T>>(valueCache!!)

результат равен

enter image description here

где T - класс пользователя

класс UserRole: Сериализуемый {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
var id: Long = 0

@Min(value = 1)
@JsonProperty("role_id")
@JoinColumn(name = "role_id", updatable = false, nullable = false)
var roleId: Long = 0

} ​​

1 Ответ

0 голосов
/ 18 декабря 2018

То, что вы сообщаете, выглядит неправильно, я попробовал ваш код, и он работает как положено.Пожалуйста, проверьте следующий фрагмент кода:

data class Role(val id: String, val name: String)
data class User(val id: String, val name: String, val email: String, val phone: String, val roles: List<Role>)


val objectMapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule())
    .registerModule(Jdk8Module())
    .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

val json = """
    {
        "id": "1",
        "name": "John Smith",
        "email": "john@smith@mail.com",
        "phone": "+1-541-754-3010",
        "roles": [
            {"id": "1", "name": "User"},
            {"id": "1", "name": "Editor"},
            {"id": "1", "name": "Admin"}
        ]
    }
""".trimIndent()

val result = objectMapper.readValue<Optional<User>>(json)
println(result)

Выход

Необязательно [Пользователь (id = 1, имя = Джон Смит, электронная почта = Джон @ Смит)@ mail.com, телефон = + 1-541-754-3010, роли = [Роль (id = 1, имя = Пользователь), Роль (id = 1, имя = Редактор), Роль (id = 1, имя = Администратор)])]

И отладочная проверка действительно сообщает правильные типы

enter image description here

...