场景:使用 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序列化。
文章结束 欢迎指正 谢谢。