Spring Boot десериализует ResponseEntity для REDIS - PullRequest
0 голосов
/ 10 мая 2018

Когда мой код пытается десериализовать ResponseEntity для REDIS, у меня появляется эта ошибка:

вложенным исключением является com.fasterxml.jackson.databind.JsonMappingException: невозможно создать экземпляр org.springframework.http.ResponseEntity : не найдено подходящего конструктора, невозможно десериализовать из значения объекта ( отсутствует конструктор по умолчанию или создатель, или, возможно, необходимо добавить / включить информацию о типе?)

Мой контроллер:

@Cacheable(value = "restapi", keyGenerator = "customKeyGenerator")
    @RequestMapping(value = "/restapi/{id}", method = RequestMethod.GET, produces = { "application/json;charset=UTF-8" })
    @ResponseStatus(HttpStatus.OK)

    public ResponseEntity<Object> findRestApi(@PathVariable("id") Integer id) {

        RestModel model= new RestModel ();

        model = restService.findRestById(id);

        return new ResponseEntity<>(produto, headers, HttpStatus.OK);
}

Мой класс конфигурации Redis

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {

    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private Integer port;

    @Bean
    public JedisConnectionFactory redisConnectionFactory() {
        JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();
        redisConnectionFactory.setHostName(host);
        redisConnectionFactory.setPort(port);
        return redisConnectionFactory;
    }

    @Bean
    RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory rcf) {

        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(rcf);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new JsonRedisSerializer());

        return template;
    }

    static class JsonRedisSerializer implements RedisSerializer<Object> {

        private final ObjectMapper om;

        public JsonRedisSerializer() {
            this.om = new ObjectMapper().enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);
        }

        @Override
        public byte[] serialize(Object t) throws SerializationException {
            try {
                return om.writeValueAsBytes(t);
            } catch (JsonProcessingException e) {
                throw new SerializationException(e.getMessage(), e);
            }
        }

        @Override
        public Object deserialize(byte[] bytes) throws SerializationException {

            if(bytes == null){
                return null;
            }

            try {
                return om.readValue(bytes, Object.class);
            } catch (Exception e) {
                throw new SerializationException(e.getMessage(), e);
            }
        }
    }

    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        cacheManager.setDefaultExpiration(300);
        return cacheManager;
    }

    @Bean
    public KeyGenerator customKeyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                StringBuilder sb = new StringBuilder();
                sb.append(o.getClass().getName());
                sb.append(method.getName());
                for (Object obj : objects) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
}

Кто-то знает, что я могу сделать? Спасибо !!

...