Сериализовать значение mappingjackson

#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 тривиально.