redisTemplate执行lua脚本出错 Missing type id when trying to resolve subtype of [simple type, class

时间:2025-02-17 22:57:27
场景:使用 redisTemplate 执行lua脚本,返回一个字符串时,lua脚本执行成功,但是返回下面的错误,这个是因为结果序列化导致的,我们返回的字符串是一个 {} , 无法被 GenericJackson2JsonRedisSerializer 序列化
: Could not read JSON: Missing type id when trying to resolve subtype of [simple type, class ]: missing type id property '@class'
 at [Source: (byte[])"{}"; line: 1, column: 2]; nested exception is : Missing type id when trying to resolve subtype of [simple type, class ]: missing type id property '@class'
 at [Source: (byte[])"{}"; line: 1, column: 2]
	at .(:132)
	at .(:110)
	at (:49)
	at (:123)
	at (:91)
	at $execute$0(:68)
	at (:224)
	at (:184)
	at (:171)
	at (:58)
	at (:52)
	at (:346)

看下 redisTemplate 的配置

 @Autowired
    private RedisTemplate redisTemplate;

    @Bean
    public RedisTemplate redisTemplateInit(){
        (new StringRedisSerializer());
        (new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }

    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory){
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        (connectionFactory);
        return container;
    }

    /**
     * @Title:
     * @Description:   Lua脚本对象
     * @return
     * @throws
     * @author qiaomengnan
     * @date 2020/07/21
     */
    @Bean
    public DefaultRedisScript<String> branchNameGetData() {
        DefaultRedisScript<String> redisScript = new DefaultRedisScript<>();
        (new ResourceScriptSource(new ClassPathResource("scripts/")));
        ();
        return redisScript;
    }

local keyPrefix = KEYS[1]
local keyValues = ARGV
local result = "{"

for i, value in ipairs(keyValues) do
    local data = ("GET", keyPrefix..value)
    if(data)
    then
        result = result.."\""..value.."\""..":\""..data.."\","
    end

end

if ((result) > 1)
then
    result = (result ,0 , -2)
end

return result.."}"
Java代码调用
String data = ().execute(branchNameGetData
                , (())
                , ());

原因是因为我们把 redisTemplate 的值序列化设置成了 GenericJackson2JsonRedisSerializer ,lua脚本返回的是一个拼接字符串,虽然是一个json字符串,但是无奈识别不了

解决方案
    String data = ().execute(branchNameGetData
                , ().getStringSerializer()
                , ().getStringSerializer()
                , (())
                , ());

是的,你没看错,多传两个参数,意思是 args 和 result 都使用string序列化。

文章结束 欢迎指正 谢谢。