#java #spring-boot #serialization #redis
Вопрос:
Цель
Значение отображения кэша Jackson при возврате с контроллера загрузки spring.
Шаги по воспроизведению
Метод-
@GetMapping("/{id}")
@Cacheable(key = "#id")
fun getAccessRoleDetails(
@PathVariable("id")
@NotBlank(message = "Please provide a access role id")
id: UUID
): MappingJacksonValue {
println(
"""
called in port ${serverProperties.port}
""".trimIndent()
)
val accessRole = accessRoleRepo.findById(id.toString())
if (accessRole.isEmpty) {
throw GenericException(
errorMessage = "not found",
code = HttpStatus.NOT_FOUND.value()
)
}
val mappingJacksonValue = MappingJacksonValue(accessRole)
mappingJacksonValue.filters = SimpleFilterProvider()
.addFilter(
"filterOne",
SimpleBeanPropertyFilter.filterOutAllExcept(
"id",
"code",
"createdDate",
"description",
"lastUpdated",
"title",
"accessControlPolicies"
)
)
.addFilter(
"filterTwo",
SimpleBeanPropertyFilter.filterOutAllExcept(
"id",
"code",
"createdDate",
"description",
"lastUpdated",
)
)
return mappingJacksonValue
}
Ошибка-
2021-10-14 11:40:01.525 ERROR 7308 --- [nio-8100-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [org.springframework.http.converter.json.MappingJacksonValue]] with root cause
java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [org.springframework.http.converter.json.MappingJacksonValue]
Есть ли способ сериализовать значение mappingjackson или мне нужно внести изменения в тип возвращаемого значения?
Комментарии:
1. Я вижу, что
MappingJacksonValue
это не окончательное решение. Затем должна быть возможность расширить класс как новый класс, который также реализуетSerializable
, скажемCustomMappingJacksonValue extends MappingJacksonValue implements Serializable
. Ты пробовал это сделать?2. Вероятно, вы используете сериализацию по умолчанию для redis, для этого требуется, чтобы объекты были сериализуемыми (и
MappingJacksonValue
это не так). Вы можете использовать docs.spring.io/spring-data/redis/docs/current/api/org/… вместо этого.3. @josejuan, можете ли вы предложить какой-либо пример кода. Я не могу его выполнить. он сохраняет значение JSON в Redis, но сохраняет неправильное значение. и выдает ошибку при десериализации.
4. @SagarNayak опубликуйте минимальный воспроизводимый пример (что вы не можете сериализовать?), это
MappingJacksonValue
тривиально.